mysql查询不区分大小写
如果都是默认的话,其实就是不区分的,但是可能设置了排序规则之类的东西,导致了区分大小写,那怎么解决呢。
References:
- https://dev.mysql.com/doc/refman/8.0/en/case-sensitivity.html 官方文档,很详细,建议阅读
- https://stackoverflow.com/questions/3936967/mysql-case-insensitive-select sf讨论
- https://stackoverflow.com/questions/3936967/mysql-case-insensitive-select
最简单的处理方式就是更换字符集,例如将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记录)
如果可以的话,建议直接修改字符集和排序规则。不行的话,挑一个垃圾方法凑合用吧。