Theo mặc định, SQLite LIKE
toán tử không phân biệt chữ hoa chữ thường đối với các ký tự ASCII. Điều này có nghĩa là nó sẽ khớp với các ký tự viết hoa và viết thường, bất kể bạn sử dụng kiểu chữ nào trong mẫu của mình.
Tuy nhiên, có một kỹ thuật bạn có thể sử dụng để phân biệt chữ hoa chữ thường.
SQLite có một câu lệnh PRAGMA được gọi là case_sensitive_like , được thiết kế để đặc biệt tạo ra LIKE
toán tử phân biệt chữ hoa chữ thường cho các ký tự ASCII.
Lý do tôi chỉ định “ký tự ASCII” là vì LIKE
theo mặc định, toán tử có phân biệt chữ hoa chữ thường đối với các ký tự unicode nằm ngoài phạm vi ASCII.
Do đó, nếu bạn cần LIKE
toán tử phân biệt chữ hoa chữ thường trong phạm vi ASCII, case_sensitive_like Tuyên bố PRAGMA có thể là những gì bạn đang tìm kiếm.
Điều này cũng áp dụng cho like()
, hoạt động giống hệt như LIKE
nhà điều hành.
Bật / Tắt Phân biệt chữ hoa chữ thường
Bạn có thể sử dụng bất kỳ giá trị boolean nào sau đây để bật phân biệt chữ hoa chữ thường:
1
on
true
yes
Bạn có thể sử dụng bất kỳ giá trị boolean nào sau đây để tắt phân biệt chữ hoa chữ thường:
0
off
false
no
Đối số có thể nằm trong dấu ngoặc đơn hoặc có thể được phân tách khỏi tên pragma bằng một dấu bằng.
Các đối số từ khóa có thể tùy ý xuất hiện trong dấu ngoặc kép.
Ví dụ về phân biệt chữ hoa chữ thường
Trước tiên, hãy xem điều gì sẽ xảy ra khi chúng tôi không sử dụng case_sensitive_like Tuyên bố PRAGMA.
SELECT
'a' LIKE 'A',
'æ' LIKE 'Æ';
Kết quả:
'a' LIKE 'A' 'æ' LIKE 'Æ' ------------ ------------ 1 0
Trong trường hợp này, cột đầu tiên không phân biệt chữ hoa chữ thường - chữ hoa A khớp với chữ thường a .
Và đây là một truy vấn đối với một bảng cơ sở dữ liệu.
SELECT
CatName,
CatName LIKE 'br%'
FROM Cats;
Kết quả:
CatName CatName LIKE 'br%' ---------- ------------------ Brush 1 Brash 1 Broosh 1 100%Fluff 0 100$Fluff 0
Trong trường hợp này, chúng tôi nhận được một trận đấu với tất cả những con mèo có tên bắt đầu bằng Br , mặc dù tiêu chí của chúng tôi đã sử dụng chữ thường b .
Ví dụ về phân biệt chữ hoa chữ thường
Bây giờ, hãy xem điều gì sẽ xảy ra khi chúng tôi sử dụng case_sensitive_like Tuyên bố PRAGMA để bật phân biệt chữ hoa chữ thường trong phạm vi ASCII.
PRAGMA case_sensitive_like = 1;
SELECT
'a' LIKE 'A',
'æ' LIKE 'Æ';
Kết quả:
'a' LIKE 'A' 'æ' LIKE 'Æ' ------------ ------------ 0 0
Vì vậy, lần này chữ hoa A không khớp với chữ thường a .
Và đây là ví dụ về cơ sở dữ liệu sau khi bật phân biệt chữ hoa chữ thường.
SELECT
CatName,
CatName LIKE 'br%'
FROM Cats;
Kết quả:
CatName CatName LIKE 'br%' ---------- ------------------ Brush 0 Brash 0 Broosh 0 100%Fluff 0 100$Fluff 0
Lưu ý rằng tôi không cần chạy lại câu lệnh PRAGMA. Cài đặt vẫn còn nguyên cho kết nối của tôi cho đến khi tôi thay đổi nó.
Tắt phân biệt chữ hoa chữ thường
Dưới đây là một ví dụ về cách tắt phân biệt chữ hoa chữ thường và chạy lại truy vấn.
PRAGMA case_sensitive_like = 0;
SELECT
CatName,
CatName LIKE 'br%'
FROM Cats;
Kết quả:
CatName CatName LIKE 'br%' ---------- ------------------ Brush 1 Brash 1 Broosh 1 100%Fluff 0 100$Fluff 0
Hàm Like ()
Như đã đề cập, case_sensitive_like Câu lệnh PRAGMA cũng ảnh hưởng đến like()
chức năng.
PRAGMA case_sensitive_like = 1;
SELECT
CatName,
like('Br%', CatName),
like('br%', CatName)
FROM Cats;
Kết quả:
CatName like('Br%', CatName) like('br%', CatName) ---------- -------------------- -------------------- Brush 1 0 Brash 1 0 Broosh 1 0 100%Fluff 0 0 100$Fluff 0 0
Toán tử THÍCH Unicode-Aware
Bạn cũng có thể sử dụng tiện ích mở rộng SQLite ICU nếu bạn cần nhận dạng unicode LIKE
nhà điều hành.
Việc triển khai LIKE
bao gồm trong tiện ích mở rộng này sử dụng hàm ICU u_foldCase()
để cung cấp các so sánh độc lập với chữ hoa chữ thường cho đầy đủ các ký tự unicode.