萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL SELECT 大小寫敏感查詢三大法:COLLATE 設定、BINARY 轉換與函數比較

方法一:定義欄位/表 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()**否**不建議大量資料

最佳實踐

  1. 設計階段決定:業務需區分大小寫 → 定義 _bin/_cs
  2. 避免查詢時加 COLLATE/BINARY 導致全表掃描
  3. 統一字元集 utf8mb4,搭配 utf8mb4_bin 或 utf8mb4_0900_as_cs (MySQL 8.0)
copyright © 萬盛學電腦網 all rights reserved