1

SQLクエリで「orderby」ステートメントを機能させようとしています。しかし、何らかの理由で、デンマークの特殊文字は、その価値を評価する代わりに拡張されます。

SELECT roadname FROM mytable ORDER BY roadname

結果:

  • Abildlunden
  • Æblerosestien
  • Agern Alle 1

真ん中の結果は最後になるはずです。

ロケールはデンマーク語に設定されているため、デンマーク語の特殊文字の値を知っている必要があります。

4

1 に答える 1

6

あなたのデータベースの照合は何ですか?(使用しているPostgreSQLのバージョンを指定することもできます)psqlの「\l」を使用して確認します。

比較対照:

steve@steve@[local] =# select * from (values('Abildlunden'),('Æblerosestien'),('Agern Alle 1')) x(word)
order by word collate "en_GB";
     word      
---------------
 Abildlunden
 Æblerosestien
 Agern Alle 1
(3 rows)

steve@steve@[local] =# select * from (values('Abildlunden'),('Æblerosestien'),('Agern Alle 1')) x(word)
order by word collate "da_DK";
     word      
---------------
 Abildlunden
 Agern Alle 1
 Æblerosestien
(3 rows)

データベース照合は、データベースクラスターを作成するときに、その時点で設定したロケールから設定されます。パッケージマネージャー(apt-getなど)を介してPostgreSQLをインストールした場合は、system-defaultロケールから取得されている可能性があります。

特定の列で使用されている照合、または特定の式で使用されている照合をオーバーライドできます(上記の例で行われているように)。ただし、(可能性が高い)何も指定しない場合は、データベースのデフォルトが使用されます(データベースの作成時にテンプレートデータベースから継承され、クラスターの作成時にテンプレートデータベースの照合が修正されます)

全体を通してデフォルトの照合として使用したいがda_DK、現在データベースのデフォルトではない場合、最も簡単なオプションは、データベースをダンプしてから、クラスターをドロップして再作成し、照合先initdb(またはpg_createcluster使用するツール)を指定することです。サーバーを作成します)

ところで、質問はうまく表現されていません。PostgreSQLは「特殊」文字をほとんど無視しておらず、「Æ」を「AE」に正しく展開しています。これは英語の正しい規則です。最後に「Æ」を照合することは、実際にはローカライズされていない動作に似ています。

照合ドキュメント:http ://www.postgresql.org/docs/current/static/collat​​ion.html

于 2012-12-17T11:48:59.423 に答える