MySQL中的漢字排序是一個比較復(fù)雜的問題。在默認(rèn)情況下,MySQL是按照ASCII碼順序?qū)h字進(jìn)行排序的。這種排序方式對于英文或者純數(shù)字來說是沒有任何問題的,但是對于包含中文字符的數(shù)據(jù)來說,可能會導(dǎo)致排序結(jié)果不太準(zhǔn)確。
例如,我們有一個包含中文字符的數(shù)據(jù)表: CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 表中的數(shù)據(jù)如下: INSERT INTO `users` (`id`, `name`) VALUES (1, '張三'), (2, '李四'), (3, '王五'), (4, '趙六'), (5, '阿貍'), (6, '張三豐'); 當(dāng)我們執(zhí)行以下SQL語句: SELECT * FROM `users` ORDER BY `name`; 得到的排序結(jié)果為: 1 張三 6 張三豐 5 阿貍 4 趙六 2 李四 3 王五 可以看到,這個排序結(jié)果不太準(zhǔn)確,因為按照我們的語言習(xí)慣,應(yīng)該是先按照姓氏排序,再按照名字排序。 那么怎么解決這個問題呢?我們可以使用MySQL提供的COLLATE關(guān)鍵字來指定排序規(guī)則。
COLLATE關(guān)鍵字用來指定字符集的排序方式。我們可以使用utf8mb4_unicode_ci字符集來對中文字符串進(jìn)行排序,它采用的是Unicode規(guī)則。
我們可以修改表定義,如下: CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 當(dāng)我們執(zhí)行以下SQL語句: SELECT * FROM `users` ORDER BY `name` COLLATE utf8mb4_unicode_ci; 得到的排序結(jié)果為: 5 阿貍 2 李四 3 王五 1 張三 6 張三豐 4 趙六 這個排序結(jié)果已經(jīng)正確了。
除了utf8mb4_unicode_ci外,還有一種常用的排序規(guī)則是utf8mb4_general_ci,它采用的是一種更加寬松的比較方式,會將一些字符看作是相等的,例如大小寫字母、重音符號等。但是對于中文排序來說,它可能會導(dǎo)致一些問題,因此一般不建議使用。
上一篇163ui.json
下一篇用css做一個留言界面