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.