2017-05-15 87 views
3

我想要的是相當於在MySQL中使用utf8_unicode_ci。所以,如果我有那些​​字符串(默認排序順序在PostgreSQL):在Django中使用Postgresql 9.6如何對大小寫不區分大小寫?

  • 穀倉
  • 泡泡
  • BOEUF
  • 牛肉
  • boulette
  • bémol

我希望他們會像這樣排序(與MySQL中的utf8_unicode_ci一樣):

  • 穀倉
  • 牛肉
  • bémol
  • BOEUF
  • boulette
  • 氣泡

這種排序的是不區分大小寫,不區分重音和連字被轉換成多個字符。

我知道unaccentlower在Postgresql中,但我不知道如何使用它們從Django。

和Django/PostgreSQL的可能的解決方案:

  • 僅適用於規範化的數據(低,unaccent)排序添加新列。
  • 添加一個索引(like in this answer),但我不確定它如何與Django配合使用?

我不認爲全文搜索或Trigram可以幫助我在這裏,因爲我不一定基於文本做搜索,但我需要得到良好的排序順序。

理想情況下,查詢應該很快,所以使用另一個索引列看起來像一個很好的途徑。但我希望找到一個解決方案,我不需要爲我的數據庫中的每個現有文本列實施,這很容易維護等。是否有最佳做法來做到這一點?

回答

3

它與Django本身無關,PostgreSQL的lc_collate配置決定了這一點。我建議你查看它的值:

SHOW lc_collate; 

正確的做法是修復此配置。別忘了查看相關設置(lc_ctype等)。

但是,如果你不能創建正確的設置另一個數據庫,儘量明確collateORDER像下面的測試案例:

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上執行的。更多信息herehere

+0

據我所知,Postgresql沒有任何排序方式可以進行我想要的排序。如果你能證明我錯了,我會很開心! – Etienne

+0

@Etienne我在我的答案中添加了一個測試用例。 –

+0

我試過你的測試用例,並且'SELECT'都給出了相同的排序順序。但是我在一箇舊的OS X系統上閱讀你的消息,記得我幾年前在這個系統上可能有這個問題!我會在另一個系統上測試它並回來。謝謝! – Etienne