方法一:定義欄位/表 COLLATE (永久生效)
-- 建表指定
CREATE TABLE case_bin_test (
word VARCHAR(10)
) CHARACTER SET latin1 COLLATE latin1_bin; -- _bin = 二進位比較,大小寫敏感
-- 修改既有欄位
ALTER TABLE t MODIFY col VARCHAR(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
-- 命名規則:
-- _bin : binary, case-sensitive
-- _cs : case-sensitive
-- _ci : case-insensitive (預設)
方法二:查詢時指定 COLLATE (臨時生效)
SELECT * FROM t WHERE word = 'Abc' COLLATE utf8mb4_bin;
SELECT * FROM t WHERE word LIKE 'Abc%' COLLATE utf8mb4_bin;
方法三:BINARY 轉換 (簡潔)
SELECT * FROM t WHERE BINARY word = 'Abc';
SELECT * FROM t WHERE word = BINARY 'Abc';
-- 效果等同 COLLATE ..._bin
實測對比
-- 測試資料
INSERT INTO case_bin_test VALUES ('Frank'),('Google'),('Froogle'),('Flickr'),('flickr');
-- latin1_bin (敏感)
SELECT * FROM case_bin_test WHERE word LIKE 'f%';
-- 結果: froogle, flickr (2 筆)
-- latin1_swedish_ci (不敏感,預設)
SELECT * FROM case_bin_test WHERE word LIKE 'f%';
-- 結果: Frank, Froogle, Flickr, flickr (4 筆)
效能與選擇建議
| 方法 | 使用索引 | 適用場景 |
| 欄位 COLLATE _bin | 是 | 永久需求,大小寫有業務含義 |
| 查詢 COLLATE _bin | **否** (函數導致索引失效) | 臨時需求、少量資料 |
| BINARY | **否** | 臨時、簡潔 |
| UPPER()/LOWER() | **否** | 不建議大量資料 |
最佳實踐
- 設計階段決定:業務需區分大小寫 → 定義
_bin/_cs
- 避免查詢時加
COLLATE/BINARY 導致全表掃描
- 統一字元集
utf8mb4,搭配 utf8mb4_bin 或 utf8mb4_0900_as_cs (MySQL 8.0)