postgresql中国际字符的lower()函数

时间:2013-08-29 09:49:32

标签: postgresql

我有一个来自新旧ubuntu存储库的标准postgresql服务器。

第一个是postgresql服务器8.3.12。这里的lower()函数在丹麦字母'Æ'

上正常工作
go=#  select lower('Æ');
 lower
-------
 æ
(1 row)

现在在postgres 9.1.9上,该函数不起作用(它返回相同的大写字母)

go=# select lower('Æ');
 lower
-------
Æ
(1 row)

有没有人知道如何改变这种行为?

(我真正的问题是,ilike也不适用于丹麦字符,但我认为上面的例子会使问题更清晰)

2 个答案:

答案 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之后,使用了正确的语言环境和编码,一切都开始正常工作。