2012-05-10 35 views
2

lc_collat​​e、lc_ctype = es_PE.UTF-8でUbuntu 12.04とPG 9.1をインストールしましたが、期待通りに照合しません(u =ü=ú= U =Ú=Ü)。PostgreSQL 9.1の正しい照合番号

I場合:

CREATE TABLE testing (id integer PRIMARY KEY, dad text, mum text, name text); 
INSERT INTO testing VALUES 
    (1, 'león','valencia', 'josé'), 
    (2, 'leon', 'mendoza', 'juan'), 
    (3, 'león', 'valárd', 'jose'), 
    (4, 'león','válencia', 'jos'), 
    (5, 'león', 'mendoza', 'jua'), 
    (6, 'leon', 'valencia', 'josie'), 
    (7, 'león', 'valencia', 'josie'), 
    (8, 'leo','zara', 'juan'), 
    (9, 'león','Valencia', 'jos'); 
SELECT * FROM testing ORDER BY dad, mum, name; 

それから私は得る:

id | dad | mum | name 
----+------+----------+------- 
    8 | leo | zara  | juan 
    2 | leon | mendoza | juan 
    6 | leon | valencia | josie 
    5 | león | mendoza | jua 
    3 | león | valárd | jose 
    1 | león | valencia | josé 
    7 | león | valencia | josie 
    9 | león | Valencia | jos 
    4 | león | válencia | jos 
(9 rows) 

私が取得するように設定しなければならないの方法:

id | dad | mum | name 
----+------+----------+------- 
    8 | leo | zara  | juan 
    5 | león | mendoza | jua 
    2 | leon | mendoza | juan 
    3 | león | valárd | jose 
    9 | león | Valencia | jos 
    4 | león | válencia | jos 
    1 | león | valencia | josé 
    7 | león | valencia | josie 
    6 | leon | valencia | josie 
(9 rows) 

これを問題なくMySQLの中で行われています。しかし、私は

+0

を;'と 'SHOWのLC_CTYPE;'データベース内の、両方のリターン'es_PE.UTF-8'? – kgrittn

+0

はい@kgrittnそのようなクラスタも作成されます。あなたが提案した2番目の形式であなたの答えを読むことは、最終的には予想されない "レオ"を置きます。あなたの最初の提案をテストするために調査しますが、Makeú= uは照合の目的ではありませんか?この場合、2番目のフィールドを使用し、次に3番目のフィールドを使用する必要があります。これは、MySQLによって正しく処理されているためです。 – TJC

答えて

2

PostgreSQLは、オペレーティング・システムの照合順序を使用しています...事前にPGで9.1

おかげでそれを設定can't。ただし、異なる値の順序がランダムになることはありません。つまり、2つの文字列が照合によって等しければ、基本的にはタイ・ブレーカーとしてC照合に戻ります。

あなたには2つの可能性があります。アクセントのない文字列を並べ替えることも、文字列の連結を並べ替えることもできます。

最初のオプションでは、データベース内unaccent機能をインストールする必要があるが、このように:第二のために

SELECT * FROM testing ORDER BY unaccent(dad), unaccent(mum), unaccent(name); 

CREATE EXTENSION unaccent; 

行われてきたこと、あなたはこれを実行することができオプションをインストールする必要はありませんが、次のように実行できます:

SELECT * FROM testing ORDER BY dad || ', ' || mum || ' ' || name; 

当店ではこのようなことをしていますが、一貫性を確保するために「生成された列」を使用しています。このような単純な選択ができます

CREATE FUNCTION search_name(rec testing) 
    RETURNS text 
    LANGUAGE SQL 
AS $$ SELECT $1.dad || ', ' || $1.mum || ' ' || $1.name; $$; 

:これらの線に沿って何かあなたが `SHOWのLC_COLLATEを実行したときだけ、確認するために

SELECT * FROM testing t ORDER BY t.search_name; 
関連する問題