目前我們在枚舉字段中有一個關於MySQL排序順序的明顯問題。字段枚舉項已按照我們想要的順序排序。只是要節省,我們增加了一個CONCAT圍繞它,所以它會被轉換爲char,並下令按字母順序排列,就像建議由MySQL引用(MySQL Reference - Enum)MySQL Order By不適用於Concat(enum)
確保列詞彙整理而不是通過編碼ORDER BY CAST(col AS CHAR)或ORDER BY CONCAT(col)通過索引編號。
但是這並沒有產生預期的結果,所以我們開始進一步調查。看來order by語句不能用於枚舉和concat函數的組合。我已經寫了下面的示例腳本,這應該表明我的觀點:
CREATE TABLE test (
`col1` enum('a','b','c') COLLATE utf8_bin DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
INSERT INTO test
VALUES ('b'), ('c'), ('a');
SELECT * FROM test; -- b, c, a
SELECT * FROM test ORDER BY col1 ASC; -- a, b, c
SELECT * FROM test ORDER BY CAST(col1 AS CHAR) ASC; -- a, b, c
SELECT * FROM test ORDER BY CAST(col1 AS BINARY) ASC; -- a, b, c
SELECT * FROM test ORDER BY CONCAT(col1) ASC; -- b, c, a - This goes wrong
我目前懷疑某種與覈對/編碼的問題,但我不知道。我的數據庫默認編碼也是utf8。 MySQL版本是5.6.12,但似乎可以在MySQL 5.1中重現。存儲引擎是MyIsam,但它也與內存引擎一起使用。
任何幫助,將不勝感激。
更新:
作爲看來問題僅在MySQL 5.6和由列的排序規則產生的。使用第一個CREATE TABLE語句,查詢可以正常工作。
CREATE TABLE test (
`col1` enum('a','b','c') COLLATE utf8_general_ci DEFAULT NULL
)
第二個他們沒有。
CREATE TABLE test (
`col1` enum('a','b','c') COLLATE utf8_bin DEFAULT NULL
)
表和/或數據庫的排序規則似乎不影響查詢。查詢可以在此測試SQL Fiddle
正如你所說,目前我傾向於認爲這是一個MySQL錯誤。如果在接下來的幾天內我不會再提供其他解釋,我會盡力將其報告爲一個錯誤。 – Aceonline