Cách tiếp cận phổ biến nhất là viết thường hoặc viết hoa chuỗi tìm kiếm và dữ liệu. Nhưng có hai vấn đề với điều đó.
- Nó hoạt động bằng tiếng Anh, nhưng không phải trong tất cả các ngôn ngữ. (Có thể thậm chí không có trong hầu hết các ngôn ngữ.) Không phải mọi chữ cái viết thường đều có một chữ cái viết hoa tương ứng; không phải chữ cái viết hoa nào cũng có chữ cái viết thường tương ứng.
- Sử dụng các hàm như Lower () và Upper () sẽ giúp bạn quét tuần tự. Nó không thể sử dụng các chỉ mục. Trên hệ thống thử nghiệm của tôi, việc sử dụng low () mất khoảng 2000 lần so với truy vấn có thể sử dụng một chỉ mục. (Dữ liệu thử nghiệm có hơn 100 nghìn hàng.)
Có ít nhất ba giải pháp ít được sử dụng có thể hiệu quả hơn.
- Sử dụng mô-đun citext , phần lớn bắt chước hành vi của kiểu dữ liệu không phân biệt chữ hoa chữ thường. Khi đã tải mô-đun đó, bạn có thể tạo một chỉ mục không phân biệt chữ hoa chữ thường
CREATE INDEX ON groups (name::citext);
. (Nhưng xem bên dưới.)
- Sử dụng đối chiếu không phân biệt chữ hoa chữ thường. Điều này được đặt khi bạn khởi tạo cơ sở dữ liệu. Sử dụng đối chiếu không phân biệt chữ hoa chữ thường có nghĩa là bạn có thể chấp nhận bất kỳ định dạng nào từ mã máy khách và bạn vẫn sẽ trả về kết quả hữu ích. (Điều đó cũng có nghĩa là bạn không thể thực hiện các truy vấn phân biệt chữ hoa chữ thường. Duh.)
- Tạo một chỉ mục chức năng. Tạo một chỉ mục chữ thường bằng cách sử dụng
CREATE
INDEX ON groups (LOWER(name));
. Khi đã thực hiện điều đó, bạn có thể tận dụng chỉ mục với các truy vấn như SELECT id FROM groups WHERE LOWER(name) = LOWER('ADMINISTRATOR');
hoặc SELECT id FROM groups WHERE LOWER(name) = 'administrator';
bạn phải nhớ sử dụng LOWER ().
Mô-đun citext không cung cấp kiểu dữ liệu không phân biệt chữ hoa chữ thường. Thay vào đó, nó hoạt động như thể mỗi chuỗi được hạ thấp. Đó là, nó hoạt động như thể bạn đã gọi lower()
trên mỗi chuỗi, như trong số 3 ở trên. Ưu điểm là các lập trình viên không phải nhớ ký tự viết thường. Nhưng bạn cần đọc các phần "Hành vi so sánh chuỗi" và "Hạn chế" trong tài liệu trước khi bạn quyết định sử dụng citext.