首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 字符型數據區分大小寫:BINARY 關鍵字與 utf8_bin 校對規則雙重方案

     編輯:MySQL 綜合教學

預設行為:不區分大小寫

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

方案一:查詢級 BINARY 強制區分

SELECT * FROM test_t1 WHERE BINARY vr_web_account LIKE 'm%';
-- 僅返回 mysql
SELECT * FROM test_t1 WHERE vr_web_account LIKE BINARY 'm%';
-- 等價寫法
  • 優點:無 DDL、即時生效、不影響其他查詢
  • 缺點:可能導致**索引失效**、需開發記憶加關鍵字

方案二:列級修改 COLLATE 為 utf8_bin(推薦永久方案)

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)

校對規則家族速查

後綴全稱大小寫敏感排序特點性能
_ciCase Insensitive❌字典序 (a=A標準
_csCase Sensitive✅字典序區分大小寫略慢
_binBinary✅按字節碼值 (A=65 < a=97)最快

對比選型建議

維度BINARY 關鍵字修改列 COLLATE=utf8_bin
生效範圍單條 SQL全實例該列
索引使用可能失效 (函數列)正常走索引
排序順序臨時二進制序永久二進制序
維護成本開發自覺一次配置永久
推薦場景臨時/少量/只讀查詢業務強制區分大小寫

避坑指南

  • 修改 COLLATE 會**重建表**,大表使用 pt-online-schema-change
  • 主從環境**主從同步修改**,否則復制報錯 Error 'Collation mismatch'
  • utf8_bin 下 'A' < 'a',若需自然排序 (autf8_general_ci + BINARY 組合
  • 連接字符集 SET NAMES utf8mb4 不影響列 COLLATE,僅影響傳輸編碼

總結

**「預設不區分」≠「不能區分」**。理解 _ci/_cs/_bin 三大族系,按業務強度選擇 BINARY 戰術方案或 utf8_bin 戰略方案,讓大小寫敏感性回歸可控。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved