$str = "李";
SELECT * FROM table WHERE field LIKE '%$str%';
結果包含非「李」字記錄。原因同中文排序錯誤:ISO-8859 預設字符集導致大小寫轉換干擾中文編碼比較。
ALTER TABLE table MODIFY field VARCHAR(50) BINARY;
永久生效,所有查詢自動二進制比較。
./configure --with-charset=gbk
根治但需重新編譯部署。
SELECT * FROM table WHERE LOCATE(field, '李') > 0;
LOCATE(substr, str) 返回子字串位置,不受大小寫敏感設定影響,效能良好。
SELECT * FROM table WHERE field LIKE BINARY '%李%';
單次查詢生效,無需修改表結構,靈活性最高。
| 方法 | 生效範圍 | 效能 | 維護成本 |
|---|---|---|---|
| 欄位 BINARY | 全域 | 高 | 低(一次修改) |
| 編譯指定 charset | 全域 | 高 | 高(需重新部署) |
| LOCATE 函數 | 單查詢 | 中 | 低(SQL 寫法) |
| LIKE BINARY | 單查詢 | 高 | 最低(關鍵字) |
BINARY 或使用 utf8mb4 字符集LIKE BINARY 或改用 LOCATECOLLATE 強制轉換,效能較差且語法繁瑣