2017-05-15 16 views
3

私が望むのは、MySQLでutf8_unicode_ciを使用することに相当します。だから私は、これらの文字列(Postgresqlの持つデフォルトのソート順)がある場合:PostgreSQL 9.6でDjangoで大文字と小文字を区別する方法を区別しませんか?

  • を物置
  • バブル
  • ブッフ
  • 牛肉
  • boulette
  • bémol

私は彼らを望みますこのようにソートされます(utf8_unicode_ci、MySQLの場合):

  • 物置
  • 牛肉
  • bémol
  • ブッフ
  • boulette
  • バブル

ソートのこの種は大文字小文字を区別しない、アクセントを区別しないで、合字は、複数の文字に変換されます。

私はPostgreSQLで約unaccentlowerを知っていますが、私はDjangoからそれらをどのように使用するか分かりません。ジャンゴ/ Postgresqlのと

考えられる解決策:

  • のみ(、下unaccent)正規化されたデータをソートするために新しい列を追加します。
  • インデックス(like in this answer)を追加しますが、Djangoでどのように動作するのかよく分かりません。

私は必ずしもテキストの検索ベースではないので、フルテキスト検索やTrigramは私を助けてくれるとは思っていませんが、良いソート順を取得する必要があります。

理想的クエリが速いので、別のインデックス付きの列を使用しなければならないことは良い道のように見えます。しかし、私はDB内の既存のテキスト列ごとに実装する必要のないソリューションを見つけたいと思っています。これは簡単に維持することができます。そうするベストプラクティスはありますか?これは、Django自体とは関係ありません

答えて

3

、PostgreSQLのlc_collate構成はこれを決定します。その値を確認することをお勧めします:

SHOW lc_collate; 

正しい設定はこの設定を修正することです。関連する設定も忘れないでください(lc_ctypeなど)。

しかし、あなたは右の設定で別のデータベースを作成することができない場合は、以下のテストケースのようにORDERに明示的なcollateにしてみてください:

CREATE TEMPORARY TABLE table1 (column1 TEXT); 

INSERT INTO table1 VALUES('Barn'), 
('beef'), 
('bémol'), 
('Bœuf'), 
('boulette'), 
('Bubble'); 

SELECT * FROM table1 ORDER BY column1 COLLATE "en_US"; --Gives the expected order 
SELECT * FROM table1 ORDER BY column1 COLLATE "C"; --Gives "wrong" order (in your case) 

それは、PostgreSQLは、オペレーティングシステムのロケールに依存していることを覚えておくことが重要です。このテストケースはCentOS 7で実行されました。詳細情報hereおよびhere

+0

私の知る限り、PostgreSQLでは、必要な並べ替えを行う照合はありません。あなたが私を間違っていると証明できるなら、私は幸せになるでしょう! – Etienne

+0

@Etienne私は答えにテストケースを追加しました。 –

+0

私はあなたのテストケースを試して、両方の 'SELECT'は同じソート順を与えます。しかし、私は古いOS Xシステム上にあり、数年前にこのシステムでこの問題が発生している可能性があることを覚えています。私は別のシステムでそれをテストして戻ってくるでしょう。ありがとう! – Etienne

関連する問題