ORDER BY name 中文亂序,因預設 latin1_swedish_ci 按字節碼排序,非拼音/筆畫順序。
ALTER TABLE t MODIFY name VARCHAR(20) CHARACTER SET gbk COLLATE gbk_chinese_ci;
-- 或 utf8mb4
ALTER TABLE t MODIFY name VARCHAR(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
之後 ORDER BY name 即按中文排序規則。
ALTER TABLE t MODIFY name VARCHAR(20) BINARY;
-- 或查詢時
SELECT * FROM t ORDER BY BINARY name;
按字節碼排序,數字→大寫→小寫→漢字區碼順序,非語義排序但穩定。
SELECT * FROM core_vender_info
ORDER BY CONVERT(vender_abbrev USING gbk) COLLATE gbk_chinese_ci;
不修改表結構,臨時指定排序規則,適合遷移/兼容場景。
./configure --with-charset=gbk --with-extra-charsets=gb2312,gbk,utf8
源碼編譯時指定,影響全局預設,現多用二進位包安裝較少用。
CREATE TABLE test1 (id INT, name VARCHAR(20) CHARSET utf8);
INSERT INTO test1 VALUES (1,'鄧'),(2,'李'),(3,'江'),(4,'胡');
SELECT name FROM test1 ORDER BY name; -- 亂序
CREATE TABLE test2 (id INT, name VARCHAR(20) CHARSET gbk);
INSERT INTO test2 SELECT * FROM test1;
SELECT name FROM test2 ORDER BY name; -- 正確:鄧、胡、江、李 (拼音序)
utf8mb4 + utf8mb4_unicode_ci(支援 Emoji、排序符合 UCA 標準)。latin1 表需轉碼:ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;Illegal mix of collations。