2017-09-11 64 views
0

如何根據不同的排序規則有效地對字符串列執行ORDER BY?也就是說,來自不同文化背景的用戶的數據存儲在同一個表和同一列中,但每個用戶自然希望根據其語言環境來查看它(當然,該語言環境已知,並且每個表中的每行都是固定的)。並且表可能很長,所以列需要和索引,並且不能在應用程序端進行後期處理以達到所需的歸類(這是數據庫任務,以完成繁重工作,對吧?)。同一個MariaDB列的多個歸類?

例如,utf8_general_ciutf8_swedish_ci產生不同的結果。

雖然我認爲這個問題對於任何國際項目都是顯而易見的,但我找不到任何合適的解決方案。我自己,我才能成像只有下面的解決方案,這是不是很好,我懷疑沒有更好的可以做:

  1. 使用一個單獨的領域每個比
  2. 也許,一個視圖可以爲每個文化創建和索引因此(我還沒有和MariaDB的意見雖然工作,所以這是很理論的)
  3. 使用一個單獨的「代孕」現場只是爲了整理,也許VIRTUAL現在

,如果只有一個排序字符串列,但可能有幾個。什麼是解決這個問題的有意和正確的方法?

回答

1

只要你使用相同的字符集(在你的情況UTF8)的列存儲,以及用於讀取,你可以在ORDER BY column-name條款之後使用COLLATE some-utf8-collation

SELECT * FROM sometable ORDER BY somecolumn COLLATE utf8_swedish_ci 

在我的測試,這產生不同排序比德國排序規則:

SELECT * FROM sometable ORDER BY somecolumn COLLATE utf8_german2_ci 

那麼,只要數據包含相關字符,例如德語變音符號。如果沒有,你不會看到有什麼不同。

ORDER子句中多列各得到自己COLLATE項:

SELECT * FROM sometable 
ORDER BY 
    somecolumn COLLATE utf8_german2_ci, 
    secondcolumn COLLATE utf8_german2_ci 
+0

這是罰款,「小」表。因爲索引已經處於特定的排序規則中,因此對COLLATE子句的處理會阻止使用任何INDEX。 –

+0

哦,是的,這是正確的。當在COLLATE子句中使用不同的排序規則時,'EXPLAIN'說「使用索引,使用filesort」。那麼,在這種情況下,應該找到一種方法來複制想要的歸類中的相關列,同時儘量減少填充時的工作量。虛擬列在這裏沒有幫助,因爲它們不能得到一個'INDEX',一個持久列可以,但是'EXPLAIN'說它總是在'SELECT'中使用filesorting。因此,您最終將手動填充所需歸類的其他列。呃,更糟糕。 – Anse

+0

Filesort發生的原因很多;讓我們看看具體的查詢和「CREATE TABLE」來討論它。 –