Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Chuyển cột sang collation phân biệt chữ hoa/thường trong MySQL?

Giải pháp: COLLATE trong WHERE

Sử dụng COLLATE utf8mb4_bin (hoặc utf8_bin) trong điều kiện LIKE/WHERE để so sánh case-sensitive.

Ví dụ minh họa

Tạo bảng và dữ liệu

mysql> CREATE TABLE DemoTable (LastName VARCHAR(100));
mysql> INSERT INTO DemoTable VALUES('Brown'), ('BROWN'), ('brown'), ('BRoWN');

Dữ liệu gốc

+----------+
| LastName |
+----------+
| Brown    |
| BROWN    |
| brown    |
| BRoWN    |
+----------+

Truy vấn thường (case-insensitive)

mysql> SELECT * FROM DemoTable WHERE LastName LIKE 'BROWN';
+----------+
| LastName |
+----------+
| Brown    |
| BROWN    |
| brown    |
| BRoWN    |
+----------+

Truy vấn COLLATE (case-sensitive)

mysql> SELECT * FROM DemoTable WHERE LastName LIKE 'BROWN' COLLATE utf8mb4_bin;

Kết quả

+----------+
| LastName |
+----------+
| BROWN    |
+----------+

Các Collation phổ biến

CollationChữ hoa/thườngPhân biệt dấuCharset
utf8mb4_general_ciKhông (ci)Khôngutf8mb4
utf8mb4_unicode_ciKhông (ci)Có (Unicode)utf8mb4
utf8mb4_binCó (bin)Binaryutf8mb4
utf8_general_ciKhôngKhôngutf8
utf8_binCóBinaryutf8
latin1_binCóBinarylatin1

_ci = case insensitive, _bin = binary (case sensitive)

Đổi collation vĩnh viễn cho cột

ALTER TABLE DemoTable 
MODIFY LastName VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

Đổi collation cho toàn bảng

ALTER TABLE DemoTable CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

Ứng dụng: Tìm kiếm chính xác

-- Mật khẩu, mã code, username (case-sensitive)
SELECT * FROM users WHERE password = 'AbC123' COLLATE utf8mb4_bin;
SELECT * FROM users WHERE username = 'Admin' COLLATE utf8mb4_bin;

Lưu ý hiệu năng

  • COLLATE trong WHERE → không dùng index bình thường
  • Cần index với cùng collation: INDEX idx_name (LastName) COLLATE utf8mb4_bin
  • MySQL 8.0+: CREATE INDEX idx_name ON DemoTable((LastName COLLATE utf8mb4_bin)) (functional index)