问题在PostgreSQL 8.4中排序重音字符

时间:2011-06-28 18:56:22

标签: postgresql unicode

我使用fr_CA.UTF-8创建我的数据库,如下所示:

createdb --encoding=utf-8 --locale=fr_CA.UTF-8 --template=template0 someapp_development

然后我加载样本数据,其中包含重音字符,包括“ÉtudedeMeAndréCaron”和“Zellers inc。”。在法语中,É应该在Z之前进行排序/整理,因此我希望以下声明:

SELECT fullname FROM addressees ORDER BY LOWER(fullname)

在Z之前返回É,但遗憾的是,事实并非如此:

# select fullname from addressees where party_id in (36, 618, 1264, 2481, 4473) order by lower(fullname);
                 fullname                  
-------------------------------------------
 VRV Express inc. [4473]
 Vêtements S.P. Apparels inc. (Les) [2481]
 Zellers inc. (Galeries Orford) [1264]
 Étude de Me André Caron [618]
 Étude de Me Richard Drapeau [36]

另外注意VRV在Vêtements之前。我一定在某个地方误解了什么。更多信息:

$ psql someapp_development
psql (8.4.4, server 8.4.3)

$ psql --list
                                          List of databases
           Name            |   Owner   | Encoding |  Collation  |    Ctype    |   Access privileges   
---------------------------+-----------+----------+-------------+-------------+-----------------------
 meetphil_development      | francois  | UTF8     | fr_CA.UTF-8 | fr_CA.UTF-8 | 

1 个答案:

答案 0 :(得分:2)

经过一些测试后我的结论(关于Scientific Linux 6.0的Postgres 8.4.7)很可能是系统fr_CA语言环境中的一个错误:

-bash-4.1$ psql
psql (8.4.7)
Saisissez « help » pour l'aide.

postgres=# show lc_collate ;
 lc_collate
------------
 fr_CA.utf8
(1 ligne)

postgres=# create table addressees (party_id serial primary key, fullname text);
NOTICE:  CREATE TABLE créera des séquences implicites « addressees_party_id_seq » pour la colonne serial « addressees.party_id »
NOTICE:  CREATE TABLE / PRIMARY KEY créera un index implicite « addressees_pkey » pour la table « addressees »
CREATE TABLE
postgres=# insert into addressees (fullname) values ('VRV Express inc. [4473]'),('Vêtements S.P. Apparels inc. (Les) [2481]'),('Zellers inc. (Galeries Orford) [1264]'), ('Étude de Me André Caron [618]'),('Étude de Me Richard Drapeau [36]');
INSERT 0 5
postgres=# select * from addressees order by lower(fullname);
 party_id |                 fullname
----------+-------------------------------------------
        4 | Étude de Me André Caron [618]
        5 | Étude de Me Richard Drapeau [36]
        2 | Vêtements S.P. Apparels inc. (Les) [2481]
        1 | VRV Express inc. [4473]
        3 | Zellers inc. (Galeries Orford) [1264]
(5 lignes)

postgres=#