我在Ubuntu服务器上运行PostgreSQL 8.2,数据库编码是UTF8。一切都很好,除了一件事:我不能在sql查询中使用upper()
函数来表示西里尔符号。好吧,我可以使用它,但函数的结果仍然是小写的。
如何解决这个问题?
答案 0 :(得分:2)
这可以通过升级您的PostgreSQL版本来修复,最好是当前版本9.1。 PostgreSQL 8.2最近已经released in 2006 and reached end of life。
从那时起,对语言环境进行了大量改进。据我所见,它适用于9.0版本(在Debian Squeeze上):
SELECT upper('ѓғг̡г̨һһ̨дђеёӗ');
结果:
ЃҒГ̡Г̨ҺҺ̨ДЂЕЁӖ
注意:对于所有区域设置,我将UTF8
用作server_encoding
,UNICODE
用作client_encoding
,*.UTF-8
(de_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一部分的整理规则负责确定如何将小写字符转换为大写字符,反之亦然。看看你的!