2013-09-21 34 views
5

私は、言語のスピーカーとして、ÕÜÄÄのようないくつかの非共通の文字を持っています。私は、ユーザーがエストニア語のコンテンツをデータベースに保存できるアプリケーションを作成すれば、アプリは言語設定に従ってデータを正しく並べ替えることもできます。Postgresqlのソート言語の特定の文字(照合)

また、非常に小さな言語の槍として、エストニアのように、他の人々がアプリを使用し、自分の言語でソートしたいと考える必要があるということを考慮する必要があります。いくつかのヨーロッパ言語には、独自の特殊文字が混在しています。

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

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

例の場合: iはUTF8エンコーディングで、デフォルトの照合(英語UTF8)を使用してデータベースを作成する場合、値

alan 
oskar 
ölen 
älan 
öskar 

を含むテーブルがnimiのASCによって試験順序SELECT * FROM」で(ソートされます。 "):

alan 
älan 
ölen 
oskar 
öskar 

これは間違っています。私はPOSIXの照合、その後、同じクエリ結果を使用してデータベースを作成する場合:

​​

これは正しいように思える、あなたがミックスにさらにいくつかの名前(õ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/collation.html)。

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

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

は、エラーのエラーで失敗: "UTF8" をコードするための照合 "et_EE.utf8は" 存在しません。何故ですか? この照合ルールなどを作成する必要がありますか? これは、正しい順序で結果が必要な場合、すべてのクエリで照合ルールを指定する方法ですか? 私のロケール-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ものの失敗:私は、私はそれを考え出したと思います。質問に答えるために1:

アラン

編集私もPostgreSQLで(http://www.postgresql.org/docs/9.1/static/sql-createcollation.html)を照合そのものを作成する必要がありました:

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

は、だから私はzero323、あなたが話してくれたことを、私はそれらのシェルのロケールファイルを作成する必要が推測して、データベースに照合順序を作成し、Iすべてセットされている。

+0

どのオペレーティングシステムを使用していますか? – zero323

+0

Ubuntu linux v12.04 –

+0

ちなみに、ポルトガル語では 'a'は' a'の後で 'b'の前に来ます。なぜならアクセント付きの文字はアクセントなしで同じ文字の隣に並べられているからです。したがって 'pt-PT'の場合、私は' alan älan oskar ölen öskar'を注文すると期待しています。 – ANeves

答えて

3

あなたは使用してインストールされたロケールを確認することができます。

locale -a 

et_EEが実行を記載されていない場合、このコマンド:

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

て、もう一度あなたのクエリを試しを。

+0

ありがとうございます。 et_EEは現在リストされていますが、何も変更されていません –

+0

postgresを再ロードしようとしましたか? – zero323

+0

私はsudo /etc/init.d/postgresqlを再起動し、 "SELECT nimi COLLATE" et_EE "FROM test ORDER BY nimi ASC;を試しました。再び。そしてそれは失敗した –

関連する問題