首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 搜索大小寫敏感性完整指南

     編輯:MySQL 資料庫相關知識

默認行為

MySQL 默認不區分大小寫(取決於字符集校對規則)。例外:某些字符集如 czech 默認區分大小寫。

SELECT * FROM t WHERE col LIKE 'a%';  -- 返回 'Apple'、'apple'、'Ángel' 等

強制區分大小寫的方法

1. 列級聲明(永久生效)

CREATE TABLE t (
  col VARCHAR(50) CHARACTER SET latin1 COLLATE latin1_general_cs  -- _cs = case sensitive
);

或使用二進制校對:COLLATE latin1_bin(按字節值比較,最嚴格)。

2. 查詢級指定(臨時生效)

-- 方式一:列加 COLLATE
SELECT * FROM t WHERE col COLLATE latin1_general_cs LIKE 'a%';

-- 方式二:字符串加 COLLATE
SELECT * FROM t WHERE col LIKE 'a%' COLLATE latin1_general_cs;

-- 方式三:二進制比較
SELECT * FROM t WHERE BINARY col = 'Apple';

3. 函數/操作符轉換

SELECT * FROM t WHERE CAST(col AS BINARY) = 'Apple';
SELECT * FROM t WHERE col = BINARY 'Apple';

比較與排序的底層邏輯

類型比較單位依據大小寫敏感
非二進制字符串
(CHAR/VARCHAR/TEXT 無 BINARY)
字符 字符集校對規則權重 通常不敏感(同字母不同大小寫權重相同)
二進制字符串
(BLOB、BINARY CHAR/VARCHAR)
字節 字節數值 敏感('A'=0x41, 'a'=0x61)

簡單比較操作符(=, <, >, <=, >=, BETWEEN, IN, ORDER BY, GROUP BY)均遵循上述規則。

常見陷阱與最佳實踐

  1. 索引失效:WHERE BINARY col = 'val' 或 COLLATE 變更可能導致索引無法使用。建議列級聲明正確校對規則。
  2. 連接字符集不匹配:應用連接字符集(SET NAMES utf8mb4)應與表字符集一致,避免隱式轉換導致比較異常。
  3. 唯一約束大小寫衝突:UNIQUE INDEX 遵循列校對規則,不敏感校對下 'A' 與 'a' 衝突。
  4. 排序預期不符:ORDER BY col 依賴校對規則,二進制排序按 ASCII 碼(大寫在小寫前),字典序排序按語言規則。

校對規則命名規律

  • _ci:Case Insensitive(不區分大小寫)
  • _cs:Case Sensitive(區分大小寫)
  • _bin:Binary(二進制比較,最快、最嚴格)
  • _general:通用語言規則
  • _unicode_520:基於 Unicode 5.2.0 標準

查看支持的校對規則:SHOW COLLATION LIKE 'utf8mb4%';

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