如何在Postgres

时间:2015-12-08 10:55:18

标签: postgresql utf-8 localization postgresql-9.2

我在Postgres中排序挪威文本列时遇到问题。 我的环境:

db=# select version();
PostgreSQL 9.2.14 on x86_64-redhat-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4), 64-bit 

数据库托管在RedHat Openshift上。

运行>locale命令时,我得到:

  • locale:无法将LC_CTYPE设置为默认语言环境:没有此类文件或目录
  • locale:无法将LC_ALL设置为默认语言环境:没有此类文件或目录
  • LANG =的en_US.UTF-8
  • LC_CTYPE = UTF-8
  • LC_NUMERIC = “的en_US.UTF-8”
  • LC_TIME = “的en_US.UTF-8”
  • LC_COLLATE = “的en_US.UTF-8”
  • LC_MONETARY = “的en_US.UTF-8”
  • LC_MESSAGES = “的en_US.UTF-8”
  • LC_PAPER = “的en_US.UTF-8”
  • LC_NAME = “的en_US.UTF-8”
  • LC_ADDRESS = “的en_US.UTF-8”
  • LC_TELEPHONE = “的en_US.UTF-8”
  • LC_MEASUREMENT = “的en_US.UTF-8”
  • LC_IDENTIFICATION = “的en_US.UTF-8”
  • LC_ALL =

**编辑

db=#\l
          Name           |    Owner     | Encoding |   Collate   |    Ctype    |   Access privileges   
-------------------------+--------------+----------+-------------+-------------+-----------------------
 db                      | myadminUser  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 

这是我试过的, 这个sql显示默认排序不正确:

db=# select * from unnest(ARRAY['a','b','c','d','A','B','C','å','ø','z','Z','Ø']) as t1 order by t1;

结果: a  一个  一个  b  乙  C  C  d  Ø  Ø  ž  ž

(我认为这种顺序对于英语来说甚至是错误的,资本'A'应该在'a'之前出现不是吗?)

然后我尝试了:

db=# CREATE COLLATION nor (LOCALE = 'nn_NO.utf8');

以及之前的同一声明:

db=# select * from unnest(ARRAY['a','b','c','d','A','B','C','å','ø','z','Z','Ø']) as t1 order by t1 collate nor;

现在的结果是: A.  一个  乙  b  C  C  d  ž  ž  Ø  Ø  A

这看起来非常好,我以为我已经完成了......但是我试过了:

db=# select * from unnest(ARRAY['aaaa','bbbb','cccc','dddd','AAAA','BBBB','CCCC','åååå','øøøø','zzzz','ZZZZ','ØØØØ']) as t1 order by t1 collate nor;

结果: BBBB  BBBB  CCCC  CCCC  DDDD  ZZZZ  ZZZZ  呜  呜  AAAA  AAAA  AAAA

我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

顺序正确。在挪威语中,“ aa”是“å”的拼写,应该放在结尾。

来源:https://en.wikipedia.org/wiki/%C3%85

丹麦语和挪威语中正确的字母顺序将Å排在最后 字母中的字母,顺序为Æ,Ø,Å。这也是事实 替代拼写为“ Aa”。除非手动纠正,否则排序 将针对丹麦语或挪威语本地化的程序算法 例如Aaron紧随Zorro之后。