MySQL 字符列預設校對規則為 _ci (Case Insensitive),'MySQL' = 'mysql' = 'MYSQL' 均為真。
CREATE TABLE test_t1 (vr_web_account VARCHAR(100)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO test_t1 VALUES ('MySQL'),('mysql');
SELECT * FROM test_t1 WHERE vr_web_account LIKE 'm%';
-- 返回兩行:MySQL、mysql
SELECT * FROM test_t1 WHERE BINARY vr_web_account LIKE 'm%';
-- 僅返回 mysql
SELECT * FROM test_t1 WHERE vr_web_account LIKE BINARY 'm%';
-- 等價寫法
ALTER TABLE test_t1
MODIFY COLUMN vr_web_account VARCHAR(100)
CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL;
SHOW CREATE TABLE test_t1;
-- 顯示 COLLATE=utf8_bin
SELECT * FROM test_t1 WHERE vr_web_account LIKE 'm%';
-- 僅返回 mysql(無需 BINARY)
| 後綴 | 全稱 | 大小寫敏感 | 排序特點 | 性能 |
|---|---|---|---|---|
| _ci | Case Insensitive | ❌ | 字典序 (a=A | 標準 |
| _cs | Case Sensitive | ✅ | 字典序區分大小寫 | 略慢 |
| _bin | Binary | ✅ | 按字節碼值 (A=65 < a=97) | 最快 |
| 維度 | BINARY 關鍵字 | 修改列 COLLATE=utf8_bin |
|---|---|---|
| 生效範圍 | 單條 SQL | 全實例該列 |
| 索引使用 | 可能失效 (函數列) | 正常走索引 |
| 排序順序 | 臨時二進制序 | 永久二進制序 |
| 維護成本 | 開發自覺 | 一次配置永久 |
| 推薦場景 | 臨時/少量/只讀查詢 | 業務強制區分大小寫 |
pt-online-schema-changeError 'Collation mismatch'utf8_bin 下 'A' < 'a',若需自然排序 (autf8_general_ci + BINARY 組合SET NAMES utf8mb4 不影響列 COLLATE,僅影響傳輸編碼**「預設不區分」≠「不能區分」**。理解 _ci/_cs/_bin 三大族系,按業務強度選擇 BINARY 戰術方案或 utf8_bin 戰略方案,讓大小寫敏感性回歸可控。