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

Truy vấn trùng tên, họ tương tự khác chữ hoa/thường trong MySQL

Bài toán

Tìm các bản ghi có FirstName trùng nhau và LastName giống nhau khi bỏ qua chữ hoa/thường (case-insensitive).

Ví dụ

Tạo bảng:

CREATE TABLE DemoTable623 (
    FirstName VARCHAR(100),
    LastName VARCHAR(100),
    Age INT
);
INSERT INTO DemoTable623 VALUES
('John', 'Smith', 23),
('Adam', 'smith', 23),
('Chris', 'Brown', 24),
('Robert', 'brown', 21);

Truy vấn: LastName = 'smith' (bỏ qua case):

SELECT FirstName FROM DemoTable623
WHERE LOWER(LastName) = 'smith';

Kết quả:

+-----------+
| FirstName |
+-----------+
| John      |
| Adam      |
+-----------+

Giải thích

  • LOWER(LastName) chuyển về chữ thường → so sánh với 'smith' (thường).
  • MySQL default collation (utf8_general_ci, utf8mb4_0900_ai_ci) đã case-insensitive.
  • Nên dùng collation CI thay vì function LOWER() để tận dụng index.

Cách tốt hơn (sử dụng collation)

-- Nếu cột có collation CI (mặc định)
WHERE LastName = 'smith'  -- Đã case-insensitive

-- Ép collation trong query
WHERE LastName COLLATE utf8mb4_general_ci = 'smith'

-- Tạo index case-insensitive
CREATE INDEX idx_lastname_ci ON DemoTable623 (LastName COLLATE utf8mb4_general_ci);

Tìm cặp trùng lặp (duplicate groups)

SELECT LOWER(LastName) AS lname, COUNT(*), GROUP_CONCAT(FirstName)
FROM DemoTable623
GROUP BY LOWER(LastName)
HAVING COUNT(*) > 1;

Kết quả: smith (2), brown (2).

Lưu ý

  • Tránh LOWER() trên cột trong WHERE nếu cần index (function-based index MySQL 8.0.13+ hỗ trợ).
  • Collation _ci = case-insensitive, _cs = case-sensitive, _bin = binary.
  • Unicode: utf8mb4_0900_ai_ci (accent-insensitive + case-insensitive) là mặc định MySQL 8.0.