4

da_DK.utf8 ロケールで作成された PostgreSQL 8.4 データベースがあります。

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....

ダッシュ接頭辞は無視されているようです。

注文時に列を latin1 に変換することで、この問題を解決できます。

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

次のように期待される結果が得られます。

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

ダッシュ接頭辞がデフォルトで無視されるのはなぜですか? その行動を変えることはできますか?

4

3 に答える 3

5
于 2011-02-10T11:00:05.757 に答える
1

私の特定のケースで機能する回避策は、ダッシュを感嘆符に置き換えることです。たまたま感嘆符が表示されず、文字や数字の前に並べ替えられることを知っています。

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

確かにパフォーマンスに影響するので、ソート用の特別な列を作成することを検討するかもしれませんが、それも本当に好きではありません...

于 2011-02-10T12:10:58.287 に答える
0

オランダ語の順序規則がどのように見えるかはわかりませんが、スペース、ダッシュなどのポーランド語の特殊文字は、ほとんどの辞書での並べ替えで「カウント」されません。いくつかの優れたソート ルーチンは同じことを行い、そのような特殊文字を無視します。おそらくオランダ語にも同様のルールがあり、このルールはUbuntuのロケールを意識したソート機能によって実装されています。

于 2011-02-10T11:03:46.687 に答える