UPPER()不适用于PostgreSQL 8.2数据库中的西里尔符号

时间:2011-12-26 19:31:19

标签: sql postgresql encoding

我在Ubuntu服务器上运行PostgreSQL 8.2,数据库编码是UTF8。一切都很好,除了一件事:我不能在sql查询中使用upper()函数来表示西里尔符号。好吧,我可以使用它,但函数的结果仍然是小写的。

如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

这可以通过升级您的PostgreSQL版本来修复,最好是当前版本9.1。 PostgreSQL 8.2最近已经released in 2006 and reached end of life

从那时起,对语言环境进行了大量改进。据我所见,它适用于9.0版本(在Debian Squeeze上):

SELECT upper('ѓғг̡г̨һһ̨дђеёӗ');

结果:

ЃҒГ̡Г̨ҺҺ̨ДЂЕЁӖ

注意:对于所有区域设置,我将UTF8用作server_encodingUNICODE用作client_encoding*.UTF-8de_AT.UTF-8为准确) (lc_*)。其他编码或区域设置可能存在特定问题。您可能希望向我们展示此查询的输出:

SELECT * FROM pg_settings WHERE name ~~ '%encod%' OR name ~~ 'lc%'

在评论中反馈后编辑:

如果设置“nothing”,则表示设置了伪语言环境C(aka Posix)。 C与任何区域设置无关,这允许更快的排序操作。这也意味着你的系统不知道,大概相当于一个西里尔字母应该是什么。

请务必阅读手册中的Locale Support章节。 (链接到版本8.2,current version here。)

但是,LC_CTYPE只能在数据库集群创建时设置。在较新的版本中,您可以将新数据库基于template0,并指定不同的区域设置和编码设置,但不能在8.2版中。

所以,我回到我最初的建议:最好的做法是安装更新版本的PostgreSQL。并记住在设置新的数据库集群时设置所需的语言环境。

PostgreSQL 9.1 is available for Debian Squeeze。所以,Ubuntu也应该有一些东西。

答案 1 :(得分:0)

可能是character set


要避免此问题,您可以自己执行upper function

正如here所见,应该通过在ascii chacacter值中添加一个来完成。

  

128 80西里尔文小写dje

     

129 81西里尔文大写DJE

您可以拥有转换表并比较值等

答案 2 :(得分:0)

作为locale一部分的整理规则负责确定如何将小写字符转换为大写字符,反之亦然。看看你的!