mysql查询不区分大小写

如果都是默认的话,其实就是不区分的,但是可能设置了排序规则之类的东西,导致了区分大小写,那怎么解决呢。

References:

最简单的处理方式就是更换字符集,例如将utf8mb4_bin改为utf8mb4_unicode_ci,ci表示case insensitive即大小写不敏感。

那如果由于种种不可描述原因,不能改字符集呢?有没有解决方案?mysql这么强大,当然有了。
一种是比较常见的,效率有些低的,简单的:

SELECT * FROM `table` WHERE LOWER(`column_name`) = LOWER("query_string")

就是将数据库字段名和查询的参数都转换为小写(或者使用UPPER函数转换为大写,一样)。这样做虽然没问题,但是在where语句中对column使用函数会导致索引失效,即会做full table scans。

另一种是官方文档中写的,效率更低的(实测),看起来很厉害的:

SELECT * FROM `table` WHERE CONVERT(`column_name` USING utf8mb4) COLLATE utf8mb4_unicode_ci = "query_string"

目测是先将其转换为utf8mb4字符集,再将排序规则改为utf8mb4_unicode_ci(不会真的改变表的设置),然后查询,使用COLLATE也会导致索引失效。

两种方式测试结果如下(360W记录)
Snipaste_2019-07-11_17-22-02.png

Snipaste_2019-07-11_17-22-47.png

如果可以的话,建议直接修改字符集和排序规则。不行的话,挑一个垃圾方法凑合用吧。

标签: none

添加新评论

ali-01.gifali-58.gifali-09.gifali-23.gifali-04.gifali-46.gifali-57.gifali-22.gifali-38.gifali-13.gifali-10.gifali-34.gifali-06.gifali-37.gifali-42.gifali-35.gifali-12.gifali-30.gifali-16.gifali-54.gifali-55.gifali-59.gif

加载中……