我有一个来自新旧ubuntu存储库的标准postgresql服务器。
第一个是postgresql服务器8.3.12。这里的lower()函数在丹麦字母'Æ'
上正常工作go=# select lower('Æ');
lower
-------
æ
(1 row)
现在在postgres 9.1.9上,该函数不起作用(它返回相同的大写字母)
go=# select lower('Æ');
lower
-------
Æ
(1 row)
有没有人知道如何改变这种行为?
(我真正的问题是,ilike也不适用于丹麦字符,但我认为上面的例子会使问题更清晰)
答案 0 :(得分:4)
您的数据库可能是使用不同的区域设置创建的。
在\l+
中查看旧版和新版的psql
。它们将具有不同的区域设置。
其他可能性是不同的操作系统/版本。 PostgreSQL使用libc的语言环境规则,有些平台(特别是Mac OS X)有点......特别... libc。
在9.1.9上,在Fedora 19上运行en_AU.UTF-8
数据库,我得到:
regress=> select lower('Æ');
lower
-------
æ
(1 row)
答案 1 :(得分:1)
问题原来是PostgreSQL集群是在安装时由系统(Ubuntu 12.04)创建的,并且将C作为lc_ctype,将ASCII作为编码,而不是继承自en_DK的语言环境。 UTF8。在执行pg_dropcluster和pg_createcluster之后,使用了正确的语言环境和编码,一切都开始正常工作。