2017-06-06 82 views
0

我面臨一些奇怪的排序問題,我真的不明白。我有兩列或三列含有波蘭語重音字母的表,如「英鎊」。由於此字母的出現,utf8_unicode_520_ci整理最適合我的目的。我在我的PHP頁面中遇到了這個問題。 Webserver運行Apache 2.4,PHP 7.1.0,MySQL 5.7。MYSQL:錯誤的排序規則是挑選的查詢

連接到數據庫後,我設置的字符集和校對規則是這樣的:

$connection->set_charset("utf8"); 
$connection->query("SET NAMES utf8 COLLATE utf8_unicode_520_ci;"); 

後來我仔細檢查使用SHOW VARIABLES LIKE '%collat%';SHOW VARIABLES LIKE '%char%';實際的字符集和校對其在以下信息格式化的形式回報:

collation_connection->utf8_unicode_520_ci 
collation_database->utf8_unicode_520_ci 
collation_server->binary 
character_set_client->utf8 
character_set_connection->utf8 
character_set_database->utf8 
character_set_filesystem->binary 
character_set_results->utf8 
character_set_server->binary 
character_set_system->utf8 
character_sets_dir->/usr/share/mysql/charsets/ 

直到這一點,一切似乎都是正確的。但我面對的訂貨問題,當我運行下面的查詢:

SELECT birthPlace FROM persons ORDER BY birthPlace DESC LIMIT 5; 

這retrun以下結果:

Łapsze Wyżne 
Łapsze Wyżne 
Zvolenská Slatina 
Župčany 
Župčany 

輸入「ŁapszeWyżne」不應被列爲最後按utf8_unicode_520_ci整理它應該與從正常的「L」字符開始的條目一起列出。所以很顯然,它選擇了其他排序規則,然後是utf8_unicode_520_ci.I認爲是utf8_general_ci排序規則使用了什麼(從結果順序猜測)。表和列「birthPlace」的整理是utf8_unicode_520_ci。我預計整理優先級將分別是默認的列,表,數據庫。

phpMyAdmin和MySQL Workbench按預期排序條目。但我的腳本沒有按預期排序。

所以我的問題是真的是用什麼整理如果沒有明確的查詢設置以及如何解決它,如果沒有可能修改查詢。

編輯:問題本身不是關於如何選擇適當的歸類,因爲我已經知道並定義排序是正確的我對我能控制所有地方的目的。如果在SELECT查詢中未定義爆炸式定義,則使用排序規則。它是連接,列,表,數據庫還是服務器的整理?或者它是使用字符集的默認排序規則(在我的情況下,對於uth8字符集,它是utf8_general_ci?從文檔中我不清楚)我希望通過utf8_unicode_520_ci默認排序結果,而不在將來運行的每個查詢中定義結果。這是可能的嗎?

回答

0

因爲這個問題似乎更多的是關於波蘭的排序規則,而不約「最好的PHP」,我重新打開它。

utf8_unicode_520_ci對待L=l=Ĺ=ĺ=Ļ=ļ=Ł=ł。幾乎所有其他UTF8歸類治療L=l=Ĺ=ĺ=Ļ=ļ < Ł=ł,特別Ł爲有效LM之前出現的信。

如果波蘭語是數據庫的主要內容,我建議你考慮utf8_polish_ci。請注意,C,N,O,S,Z上的重音符號可能(或不可能)按照您在此歸類中希望的方式進行處理。

請參閱瞭解MySQL各種utf8歸類中字母排序的順序。

治療Ł的'責任'轉到Unicode版本5.20。 Unicode 9.0也以同樣的方式工作。

通過MySQL 5.7,「最適合PHP」(或任何其他一般應用程序)是utf8mb4_unicode_520_ci。在MySQL 8.0中,utf8mb4_0900_ai_ci可能被認爲是「最好的」。

(注:CHARACTER SET UTF8是大多數語言不夠好utf8mb4是一個超集,用表情符號,並加入中國其他地區。)