2011-02-10 9 views
2

da_DK.utf8ロケールで作成されたPostgreSQL 8.4データベースがあります。PostgreSQLは注文時にダッシュを無視します

dbname=> show lc_collate; 
lc_collate 
------------ 
da_DK.utf8 
(1 row) 

文字を変更する列で注文する表から何かを選択すると、私は奇妙な動作IMOを取得します。その結果をご注文の際にPostgreSQLは値を接頭辞ダッシュ、例えばを無視します:

select name from mytable order by name asc; 

name 
---------------- 
Ad... 
Ae... 
Ag... 
- Ak.... 
At.... 

のようなものを返すことがダッシュプレフィックスは無視しているようです。ダッシュプレフィックスは、デフォルトでは無視されますないのはなぜ

name 
---------------- 
- Ak.... 
Ad... 
Ae... 
Ag... 
At.... 

私が注文時にlatin1のために列を変換することによって、この問題を解決することができます

select name from mytable order by convert_to(name, 'latin1') asc; 

のIは、予想通りの結果を得ますか?その行動を変えることはできますか?

+0

あなたはどのようなOSを使っているようではないですか? Windows 7では正常に動作しますが、convert_to()は必要ありません。 –

+0

私はUbuntuサーバー10.10を実行しています。PostgreSQLはバージョン8.4.7です。正確には – HakonB

答えて

1

私の特定のケースでうまくいく回避策は、ダッシュを感嘆符で置き換えることです。私は感嘆符を得ることは決してないと知っているし、文字や数字の前にソートされます。

select name from mytable order by translate(name, '-', '!') asc 

私は、ソートのための特別な列を作成するに見えるかもしれので、それは確かにパフォーマンスに影響しますが、私は本当にそのどちらか...

3

これは、da_DK.utf8ロケールがこのように定義しているためです。 Linuxのロケール対応ユーティリティ(例:sort)も同様です。

convert_to(name, 'latin1')は、ラテン文字の1文字セット以外の文字(たとえば、)が見つかった場合には機能しません。

order by convert_to(name, 'SQL_ASCII')を使用すると、ロケールで定義された並べ替えが無視され、単純にバイト値が使用されます。


醜いハック編集:

order by 
    (
    ascii(name) between ascii('a') and ascii('z') 
    or ascii(name) between ascii('A') and ascii('Z') 
    or ascii(name)>127 
), 
    name; 

これは、ASCII以外の文字で始まる最初のものをソートします。これは非常に醜いです。なぜなら、文字列をさらに並べ替えるのが変わってしまうからです。しかし、それはあなたのためには十分です。

+0

です。latin1への変換が何かに壊れていることは知っていましたが、実際にはデンマークの正しいソート順が必要です。たとえば、double-a( 'aa')最後に 'z'の後にソートされます。 – HakonB

+0

おそらく、この提案されたハックは十分に良いでしょう。 – Tometzky

+0

私はtranslate(name、 ' - '、 '!')ソリューションを少し覚えています。 – HakonB

0

オランダの注文ルールがわかりませんが、スペースやダッシュなどのポーランド語の特殊文字はほとんどの辞書でソートされていません。いくつかの良いソートルーチンは同じことを行い、そのような特殊文字を無視します。おそらくオランダ語でも同様のルールがあり、このルールはUbuntuのロケール対応ソート関数によって実装されています。

関連する問題