如何在MySQL中执行不区分大小写的ORDER BY排序?
MySQL实现不区分大小写的ORDER BY排序
这个问题我之前也碰到过,本质是MySQL字段的字符排序规则在搞鬼!默认如果你的字段用的是utf8_bin这类区分大小写的规则,排序时会严格按照字符的二进制值来排——大写字母的二进制值比小写的小,所以就会出现A、C、D、b、e这种大写在前的结果。下面给你几种实用的解决办法:
1. 临时指定排序规则(快速解决)
如果只是单次查询需要不区分大小写排序,直接在ORDER BY后面加上COLLATE指定不区分大小写的规则就行,比如utf8_general_ci或者utf8_unicode_ci(后者对多语言支持更精准,性能略逊于前者):
SELECT your_column FROM your_table ORDER BY your_column COLLATE utf8_general_ci;
举个具体例子,假设你的表叫letters,字段是char,那SQL就是:
SELECT char FROM letters ORDER BY char COLLATE utf8_general_ci;
执行后就能得到你想要的A、b、C、D、e排序结果。
2. 永久修改字段排序规则(一劳永逸)
如果这个字段经常需要不区分大小写排序,不如直接修改表结构,把字段的排序规则改成不区分大小写的,以后默认排序就不用额外指定了:
ALTER TABLE your_table MODIFY COLUMN your_column VARCHAR(你的字段长度) CHARACTER SET utf8 COLLATE utf8_general_ci;
比如你的字段是长度为1的字符,表名是letters,字段名是char,那就是:
ALTER TABLE letters MODIFY COLUMN char VARCHAR(1) CHARACTER SET utf8 COLLATE utf8_general_ci;
3. 通过函数转换后排序(备选方案)
还有一种思路是把字段统一转成小写或大写再排序,比如用LOWER()或UPPER()函数:
SELECT your_column FROM your_table ORDER BY LOWER(your_column);
不过要注意:这种方法会让字段上的索引失效(如果有的话),数据量比较大的时候,查询性能会受影响,所以优先推荐前两种方法。
内容的提问来源于stack exchange,提问作者Manikandan C




