7

私は、ÕÜÖÄ のようないくつかの非一般的な文字を含む言語のスピーカーとして、ユーザーがエストニア語でコンテンツをデータベースに保存できるようにするアプリを作成する場合、このアプリは次のようにデータを正しく並べ替えることができるはずだと考えています。言語設定。

また、エストニア語のような非常に小さな言語の槍として、他の人がアプリを使用して自分の言語で並べ替えを希望する可能性があることを考慮する必要があります. いくつかのヨーロッパ言語には、独自の特殊文字の組み合わせもあります。

ロシア語のような言語をミックスに含めると、さらに悪いことに、それらは完全に異なる文字を持っています.

django サイトがこれらすべての特殊文字を問題なく表示できることを知っているので、データベース レベルで行われる並べ替えだけが心配です。オブジェクトがデータベースから読み取られ、正しい言語固有の順序でソートされるようにするにはどうすればよいですか。

例: utf8 エンコーディングとデフォルトの照合 (英語 utf8) を使用してデータベースを作成すると、値を含むテーブル

alan
oskar
ölen
älan
öskar

(「select * from test order by nimi asc;」によって) 次のように並べ替えられます。

alan
älan
ölen
oskar
öskar

これは正しくありません。POSIX 照合でデータベースを作成すると、同じクエリの結果は次のようになります。

alan
oskar
älan
ölen
öskar

これは正しいと思われます。名前 (õlan、ålan) をいくつか追加すると、結果は次のようになります。

alan
oskar
älan
ålan
õlan
ölen
öskar

エストニア語のアルファベットによると、次のようになります。

alan
oskar
õlan
älan
ölen
öskar
ålan (cause å is not in estonian alphabet)

私は postgresql 9.1.9 を使用していますが、9.1 以降で照合サポートが利用できることを理解しています ( http://www.postgresql.org/docs/9.1/interactive/collat ​​ion.html )。

それは私が使うべきものですか?

SELECT nimi COLLATE "et_EE" FROM test ORDER BY nimi ASC;

エラー ERROR: collat​​ion "et_EE.utf8" for encoding "UTF8" does not exist で失敗します。何故ですか?この照合ルールなどを作成する必要がありますか? これは正しい順序で結果が必要な場合に、すべてのクエリで照合ルールを指定する方法ですか?

アラン

:1 を編集して質問に答えます: my locale -a ショー:

C
C.UTF-8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8
et_EE
et_EE.iso88591
et_EE.utf8
POSIX
zh_CN.utf8
zh_SG.utf8

sudo locale-gen et_EE.UTF-8
[sudo] password for alan: 
Generating locales...
  et_EE.UTF-8... up-to-date
Generation complete.
sudo locale-gen et_EE
Generating locales...
  et_EE.ISO-8859-1... up-to-date
Generation complete.

それでもSQLは失敗します

Edit2:私はそれを理解したと思います。postgresql でも照合自体を作成する必要がありました ( http://www.postgresql.org/docs/9.1/static/sql-createcollat ​​ion.html ):

CREATE COLLATION "et_EE" (LOCALE = "et_EE.utf8")

それで、あなたが教えてくれたゼロ323のシェルロケールファイルを作成し、データベースへの照合を作成する必要があると思います。これで準備は完了です。

4

1 に答える 1

4

次を使用して、インストールされているロケールを確認できます。

locale -a

et_EE がリストされていない場合は、次のコマンドを実行します。

sudo locale-gen et_EE
sudo locale-gen et_EE.UTF-8
sudo update-locale

クエリを再試行してください。

于 2013-09-21T14:04:27.883 に答える