Tôi muốn tìm kiếm phân biệt chữ hoa chữ thường trong truy vấn SQL. Nhưng theo mặc định, MySQL không xem xét trường hợp của chuỗi.
Bất kỳ ý tưởng về cách thực hiện tìm kiếm phân biệt chữ hoa chữ thường trong truy vấn SQL?
Tôi muốn tìm kiếm phân biệt chữ hoa chữ thường trong truy vấn SQL. Nhưng theo mặc định, MySQL không xem xét trường hợp của chuỗi.
Bất kỳ ý tưởng về cách thực hiện tìm kiếm phân biệt chữ hoa chữ thường trong truy vấn SQL?
Câu trả lời:
theo mặc định, MySQL không xem xét trường hợp của chuỗi
Điều này hoàn toàn không đúng. Bất cứ khi nào bạn create database
trong MySQL, cơ sở dữ liệu / lược đồ có một bộ ký tự và đối chiếu. Mỗi bộ ký tự có một đối chiếu mặc định; xem tại đây để biết thêm thông tin
Đối chiếu mặc định cho bộ ký tự latin1
, nghĩa là latin1_swedish_ci
không phân biệt chữ hoa chữ thường.
Bạn có thể chọn đối chiếu phân biệt chữ hoa chữ thường, ví dụ latin1_general_cs
( ngữ pháp MySQL ):
CREATE SCHEMA IF NOT EXISTS `myschema`
DEFAULT CHARACTER SET latin1
COLLATE latin1_general_cs ;
Điều này có ảnh hưởng đến những thứ như nhóm và bình đẳng. Ví dụ,
create table casetable (
id int primary key,
thing varchar(50)
);
select * from casetable;
+----+-------+
| id | thing |
+----+-------+
| 3 | abc |
| 4 | ABC |
| 5 | aBc |
| 6 | abC |
+----+-------+
Trong cơ sở dữ liệu phân biệt chữ hoa chữ thường, chúng tôi nhận được:
select thing, count(*) from casetable group by thing;
+-------+----------+
| thing | count(*) |
+-------+----------+
| ABC | 1 |
| aBc | 1 |
| abC | 1 |
| abc | 1 |
+-------+----------+
select * from casetable where thing = "abc";
+----+-------+
| id | thing |
+----+-------+
| 3 | abc |
+----+-------+
Mặc dù trong cơ sở dữ liệu không phân biệt chữ hoa chữ thường, chúng tôi nhận được:
select thing, count(*) from casetable group by thing;
+-------+----------+
| thing | count(*) |
+-------+----------+
| abc | 4 |
+-------+----------+
select * from casetable where thing = "abc";
+----+-------+
| id | thing |
+----+-------+
| 3 | abc |
| 4 | ABC |
| 5 | aBc |
| 6 | abC |
+----+-------+
Lưu ý rằng bạn cũng có thể thay đổi đối chiếu từ trong một truy vấn . Ví dụ, trong đựng pin- nhạy cảm cơ sở dữ liệu, tôi có thể làm
select * from casetable where thing collate latin1_swedish_ci = "abc";
+----+-------+
| id | thing |
+----+-------+
| 3 | abc |
| 4 | ABC |
| 5 | aBc |
| 6 | abC |
+----+-------+
Bạn luôn phải nêu câu hỏi về phiên bản MySQL nào bạn đang sử dụng, vì MySQL đang phát triển ổn định.
Được rồi, trở lại câu hỏi của bạn:
Các chức năng chuỗi trong MySQL luôn trường hợp nhạy cảm, vì vậy bạn có thể sử dụng bất kỳ chức năng LOCATE
, POSITION
hoặc INSTR
.
Ví dụ:
SELECT phone FROM user WHERE POSITION('term' IN user_name)>0;
Mẫu khớp với biểu thức chính quy ( RLIKE
hoặc REGEXP
) luôn phân biệt chữ hoa chữ thường cho tất cả các phiên bản của MySQL ngoại trừ phiên bản 3.23.4 mới nhất.
Ví dụ:
SELECT phone FROM user WHERE user_name REGEXP 'term';
Đối với cả so sánh bình thường (=) và khớp mẫu SQL ( LIKE
), hành vi phụ thuộc vào các trường có liên quan:
a. CHAR
, VARCHAR
và tất cả các biến thể của trường văn bản không so sánh trường hợp không nhạy cảm.
b. CHAR BINARY
, VARCHAR BINARY
Và tất cả các biến thể của lĩnh vực BLOB làm so sánh trường hợp nhạy cảm.
Nếu bạn so sánh một trường từ (a) với một trường từ (b), thì so sánh sẽ phân biệt chữ hoa chữ thường (độ nhạy trường hợp thắng). Xem chương "7.2.7 Kiểu chuỗi" của Hướng dẫn tham khảo MySQL và tìm các câu lệnh về sắp xếp và so sánh.
Bắt đầu với V3.23.0, cũng có thể buộc so sánh độ nhạy trường hợp với toán tử truyền BINARY
, không phụ thuộc vào các loại trường liên quan. Xem chương "7.3.7 Toán tử truyền" của Hướng dẫn tham khảo MySQL.
Vì vậy, bạn cũng có thể thay đổi loại user_name hoặc với V3.23.x hãy thử một số thứ như:
SELECT phone FROM user WHERE BINARY username LIKE '%term%';
Trong tình huống của tôi , tôi đang sử dụng Access 2010, nhưng tôi có cùng một vấn đề nhưng giải pháp lại khác: Sử dụng StrComp()
chức năng và kiểm tra kết quả của nó bằng không.
StrComp( thing, 'abc', 0) = 0
Bởi vì StrComp()
trả về -1
nếu đối số đầu tiên là "nhỏ hơn", 1
nếu nó là "lớn hơn" và 0
nếu nó là "bằng", khi nào StrComp()=0
, bạn có một kết quả khớp phân biệt chữ hoa chữ thường.
Điều này sẽ hoạt động trong MySQL bất kể bộ ký tự. CHỌN 'kiểm tra' REGEXP BINary 'TEST' NHƯ KẾT QUẢ; Đặt 'BINary' buộc so sánh nhị phân.