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

MySQL 查詢區分大小寫完整解決方案:BINARY、COLLATE、建表約束三大法

     編輯:MySQL 綜合教學

MySQL 預設大小寫不敏感問題根因與三種強制區分大小寫的標準做法

MySQL 預設字元集校對規則為 utf8_general_ci (Case Insensitive),導致 'A' = 'a' 為真,唯一索引視同重複值。本文提供查詢級、欄位級、表級三層面解決方案與原理深度解析。

校對規則命名規則速查

範例:utf8_bin, utf8_general_cs, utf8_general_ci (預設)

方法一:查詢級強制區分 — BINARY 關鍵字 (臨時、單次)

-- 建表時指定欄位校對規則
CREATE TABLE users (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL UNIQUE,
    email VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
    password_hash CHAR(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

優點:索引可用、永久生效、精確控制哪些欄位區分大小寫。
適用欄位:帳號、密碼雜湊、Token、代碼、大小寫有業務意義的識別碼。

方法三:表級預設校對規則 — 影響新增欄位

-- 單欄位修改
ALTER TABLE users MODIFY COLUMN username VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL;

-- 整表轉換 (會重建表,大表慎用)
ALTER TABLE users CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;

MySQL 大小寫敏感度完整對照表

後綴全稱大小寫敏感度用途
_binBinary敏感 (二進位比較)精確匹配、密碼、Token
_csCase Sensitive敏感業務需區分大小寫
_ciCase Insensitive不敏感 (預設)一般文本搜尋、姓名、標題
物件大小寫敏感度說明
SQL 關鍵字 (SELECT, FROM, WHERE)不敏感SeLeCt = SELECT
資料庫名、表名視作業系統而定Windows 不敏感;Linux 區分 (除非 HFS+ Mac)
表別名不敏感SELECT u.* FROM users u WHERE U.name = 'x'
欄位別名不敏感SELECT name AS n FROM users WHERE N = 'x'
欄位值 (字串比較)取決於 COLLATE預設 _ci 不敏感;_bin/_cs 敏感
變數名 (@var, 系統變數)不敏感SET @X=1; SELECT @x;

實務建議決策樹

  1. 全系統預設 utf8mb4_general_ci (不敏感),符合多數業務直覺。
  2. 需區分大小寫的欄位 (帳號、密碼、Token、代碼) → 建表時指定 COLLATE utf8mb4_bin。
  3. 既有表需修改 → ALTER TABLE ... MODIFY COLUMN ... COLLATE utf8mb4_bin (線上 DDL 5.6+ 支援)。
  4. 臨時查詢需區分 → WHERE BINARY col = 'val'。
  5. 避免整表 COLLATE utf8_bin,導致所有文本搜尋變嚴格,使用者體驗下降。

跨平台遷移陷阱

Windows (不敏感) 開發 → Linux (敏感) 部署時,表名大小寫不一致會導致 Table 'db.Users' doesn't exist。
解決:my.cnf 設定 lower_case_table_names=1 (強制小寫),或統一團隊命名規範 (全小寫 + 底線)。

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