mysql字符串比较是否忽略大小写完全取决于字段collation,如utf8mb4_unicode_ci(不敏感)或utf8mb4_bin(敏感),可通过show full columns查看;like同样受其控制,函数结果不可直接加collate。

MySQL 字符串比较是否忽略大小写,完全取决于字段的 COLLATION,不是 MySQL “默认忽略”或“默认区分”,而是你建表时没显式指定,它就用了服务器/数据库级默认规则——而这个默认值在不同版本、不同安装方式下可能不同。
查当前字段用的是什么 COLLATION
最直接的办法是看具体字段的校对规则:
-
SHOW FULL COLUMNS FROM users LIKE 'name';→ 看输出里的Collation列 - 或者更彻底:
SELECT COLLATION(name) FROM users LIMIT 1;
常见值如 utf8mb4_0900_as_cs(大小写敏感)、utf8mb4_unicode_ci(大小写不敏感)、utf8mb4_bin(二进制严格比较,a ≠ A)——后缀 _ci 才表示 case-insensitive。
为什么 WHERE 'Alice' = 'alice' 有时成立,有时不成立
这和字段定义强相关,不是 SQL 写法问题:
- 如果字段定义是
name VARCHAR(50) COLLATE utf8mb4_unicode_ci,那WHERE name = 'ALICE'就能匹配到'alice'和'Alice' - 如果是
name VARCHAR(50) COLLATE utf8mb4_bin或带BINARY属性,那就严格按字节比,'A'(65)≠'a'(97),必然不匹配 - 注意:即使表字符集是
utf8mb4,字段仍可单独指定 collation;字段 collation 优先级高于表或数据库级设置
LIKE 查询也受 COLLATION 控制,不是特殊例外
很多人以为 LIKE 天然不区分大小写,其实它完全遵循字段的 collation:
-
name LIKE 'a%'能匹配'Alice',是因为字段用的是_ci规则 - 换成
name COLLATE utf8mb4_bin LIKE 'a%',就只匹配真正以小写a开头的值 - 不能写
UPPER(name) COLLATE utf8mb4_unicode_ci LIKE '%ABC%'—— MySQL 不允许对函数结果直接加COLLATE,会报错;得改成(UPPER(name)) COLLATE ...或更稳妥地把COLLATE放在原始字段上
别被操作系统搞混:表名大小写和字段内容大小写是两套机制
Linux 下 lower_case_table_names=0 会让 SELECT * FROM User 报错(找不到表),但这和 WHERE username = 'User' 是否匹配 'user' 完全无关。前者由系统变量控制,后者只看字段 COLLATION。混淆这两者是线上排查最常踩的坑。
真正容易被忽略的是:ALTER TABLE 修改字段 collation 可能导致索引失效或锁表,生产环境慎用;临时方案永远优先选查询级 COLLATE 显式覆盖。











