MySQL 默認不區分大小寫 (默認字符集 utf8_general_ci,_ci = case insensitive)。用戶名、編碼等業務場景若需嚴格區分大小寫,直接查詢會返回錯誤結果:
-- 以下兩條結果完全一致 (預期不同) SELECT * FROM `user` WHERE name LIKE 'a%'; SELECT * FROM `user` WHERE name LIKE 'A%';
在 WHERE 條件中添加 BINARY 關鍵字,將字符串比較轉為二進制逐字節比較:
SELECT * FROM `user` WHERE BINARY name LIKE 'a%'; -- 僅匹配小寫 a 開頭 SELECT * FROM `user` WHERE BINARY name LIKE 'A%'; -- 僅匹配大寫 A 開頭
在列定義中添加 BINARY 屬性,或指定 _bin 校對規則:
-- 列級 CREATE TABLE `user` ( name VARCHAR(20) BINARY ); -- 或指定校對規則 (效果相同) CREATE TABLE `user` ( name VARCHAR(20) COLLATE utf8_bin );
ALTER TABLE ... MODIFY COLUMN ... BINARY,大表操作高風險CREATE DATABASE db_name CHARACTER SET utf8 COLLATE utf8_bin; (慎用,影響所有字符串比較)| 校對規則後綴 | 含義 | 典型場景 |
|---|---|---|
_ci | Case Insensitive (不區分大小寫) | 通用業務、模糊搜索、郵箱 |
_cs | Case Sensitive (區分大小寫) | 密碼、Token、代碼片段 |
_bin | Binary (二進制比較,區分大小寫+字節級差異) | 精確匹配、Hash值、Base64 |
MySQL 8.0 默認 utf8mb4_0900_ai_ci (不區分大小寫、不區分重音),如需區分大小寫請顯式指定 _as_cs 或 _bin。
BINARY 會導致索引失效 (全表掃描),大表慎用COLLATE utf8_bin,配合索引使用WHERE name COLLATE utf8_bin LIKE 'A%' 效果等同 BINARY