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
| Collation | Chữ hoa/thường | Phân biệt dấu | Charset |
|---|---|---|---|
utf8mb4_general_ci | Không (ci) | Không | utf8mb4 |
utf8mb4_unicode_ci | Không (ci) | Có (Unicode) | utf8mb4 |
utf8mb4_bin | Có (bin) | Binary | utf8mb4 |
utf8_general_ci | Không | Không | utf8 |
utf8_bin | Có | Binary | utf8 |
latin1_bin | Có | Binary | latin1 |
_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)