Tóm tắt
MySQL cho phép 2 cách để cột có **unique case-sensitive** nhưng **search case-insensitive**:
- Kiểu dữ liệu
VARBINARY - Collation
_bin(ví dụutf8_bin) trên cột VARCHAR
Cách 1: VARBINARY
CREATE TABLE SearchingDemo2 (
UserId VARBINARY(128) NOT NULL,
UNIQUE KEY index_on_UserId2 (UserId)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
VARBINARYlưu byte thô, so sánh byte-by-byte → case-sensitive.- Unique index trên VARBINARY phân biệt 'abc' và 'ABC'.
- Tìm kiếm:
WHERE UserId = 'abc'chỉ khớp 'abc' (case-sensitive). Để case-insensitive:WHERE UserId = BINARY 'abc'hoặc convert cả hai.
Cách 2: VARCHAR + utf8_bin collation
CREATE TABLE SearchingDemo (
UserId VARCHAR(128) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
UNIQUE KEY index_on_UserId (UserId)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
- Collation
utf8_binso sánh theo codepoint byte → case-sensitive, accent-sensitive. - Unique index phân biệt chữ hoa/thường.
- Tìm kiếm case-insensitive:
WHERE UserId COLLATE utf8_general_ci = 'abc'.
So sánh
| Đặc điểm | VARBINARY | VARCHAR + _bin |
|---|---|---|
| Lưu trữ | Byte thô | Có charset, collation |
| Độ dài tối đa | 65,535 byte | 65,535 ký tự (tùy charset) |
| Hiển thị | Cần CAST/HEX | Hiển thị trực tiếp |
| Index size | Nhỏ hơn một chút | Lớn hơn do metadata |
Khuyến nghị
- Dùng
VARCHAR ... COLLATE utf8mb4_bin(hoặcutf8_bin) cho đơn giản, tương thích Unicode tốt. - Để search case-insensitive: thêm
COLLATE utf8mb4_general_citrong WHERE.