PDO连接utf8_general_ci排序规则MySQL表仍区分大小写问题
为啥你的MySQL LIKE查询还是区分大小写?
嘿,我来帮你拆解下这个问题——明明表用了utf8_general_ci(这玩意儿本身就是不区分大小写的排序规则),PDO连接也指定了charset=utf8,为啥执行LIKE查询还是会区分大小写?大概率是这几个环节出了问题:
1. 数据库连接的排序规则没生效
你在PDO的DSN里加了charset=utf8,但有时候这个设置可能没真正生效,导致连接层面的排序规则不是utf8_general_ci。可以先跑这两个SQL确认下当前连接的参数:
SHOW VARIABLES LIKE '%character_set%'; SHOW VARIABLES LIKE '%collation%';
重点看collation_connection的值,如果它不是utf8_general_ci,那连接的排序规则会覆盖表的设置,自然查询就会区分大小写了。
2. 字段自己的排序规则和表不一致
表级的utf8_general_ci不代表每个字段都继承这个设置。说不定你的email字段单独设置了区分大小写的排序规则(比如utf8_bin)。查下表结构就能确认:
SHOW CREATE TABLE primary_profile;
看email字段的定义里有没有COLLATE utf8_bin或者其他区分大小写的规则——字段级的设置优先级比表级高。
3. 试试显式指定排序规则测试
如果以上两点排查完没问题,可以先修改查询语句,显式指定排序规则来验证:
SELECT * FROM primary_profile WHERE email LIKE :email COLLATE utf8_general_ci;
如果这样执行就不区分大小写了,那还是回到前两个点,肯定是连接或字段的排序规则没跟上。
快速修复建议
- 先确保
email字段的排序规则是utf8_general_ci,如果不是,ALTER表修改字段; - 如果连接的
collation_connection不对,可以在PDO连接后手动执行:
强制设置连接的排序规则;$conn->exec("SET NAMES utf8 COLLATE utf8_general_ci"); - 除非你明确需要区分大小写,否则别给字段用
utf8_bin这类排序规则。
内容的提问来源于stack exchange,提问作者Twiggit
相关产品推荐
相关产品推荐

