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

最佳答案

这可以通过升级PostgreSQL版本来解决,最好升级到当前版本9.1。PostgreSQL 8.2最近一直released in 2006 and reached end of life
从那时起,对locale进行了大量的改进。据我所见,它在9.0版(Debian Squeeze)中对我有效:

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

结果:
ЃҒГ̡Г̨ҺҺ̨ДЂЕЁӖ

注意:我使用UTF8作为server_encodingUNICODE作为client_encoding*.UTF-8(准确地说是de_AT.UTF-8)作为所有区域设置(lc_*)。其他编码或区域设置可能有特定的问题。您可能希望向我们显示此查询的输出:
SELECT * FROM pg_settings WHERE name ~~ '%encod%' OR name ~~ 'lc%'

评论中的反馈后编辑:
如果设置了“nothing”,则表示设置了伪语言环境C(也称为Posix)。C对任何语言环境设置都是不可知的,这允许更快的排序操作。这也意味着你的系统不知道一个西里尔字母的大写字母应该是什么。
请务必阅读手册中的Locale Support一章。(链接到8.2版,current version here
但是,LC_CTYPE只能在db cluster创建时设置。在较新版本中,您可以关闭一个新数据库template0,并指定不同的语言环境和编码设置,但在8.2版中不能。
所以,我回到我最初的建议:最好的做法是安装一个更新版本的PostgreSQL。在设置新的db集群时,请记住设置所需的区域设置。
PostgreSQL 9.1 is available for Debian Squeeze。所以,Ubuntu也应该有一些东西。

关于sql - UPPER()不适用于PostgreSQL 8.2数据库中的西里尔符号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8638576/

10-16 22:58