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

Đạt được uniqueness phân biệt chữ hoa/thường và tìm kiếm không phân biệt trong MySQL

Tóm tắt

MySQL cho phép 2 cách để cột có **unique case-sensitive** nhưng **search case-insensitive**:

  1. Kiểu dữ liệu VARBINARY
  2. 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;
  • VARBINARY lư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_bin so 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ểmVARBINARYVARCHAR + _bin
Lưu trữByte thôCó charset, collation
Độ dài tối đa65,535 byte65,535 ký tự (tùy charset)
Hiển thịCần CAST/HEXHiển thị trực tiếp
Index sizeNhỏ hơn một chútLớn hơn do metadata

Khuyến nghị

  • Dùng VARCHAR ... COLLATE utf8mb4_bin (hoặc utf8_bin) cho đơn giản, tương thích Unicode tốt.
  • Để search case-insensitive: thêm COLLATE utf8mb4_general_ci trong WHERE.