Làm thế nào để thực hiện tìm kiếm phân biệt chữ hoa chữ thường trong mệnh đề WHERE?


21

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:


22

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 databasetrong 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_cikhô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   |
+----+-------+

13

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, POSITIONhoặ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 ( RLIKEhoặ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, VARCHARvà 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%';

1

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ề -1nếu đối số đầu tiên là "nhỏ hơn", 1nếu nó là "lớn hơn" và 0nế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.

Xem ở đây , ở đây hoặc ở đây .


0

Đ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.


-2

Hãy thử điều này để tìm kiếm không nhạy cảm, nó hoạt động tốt với hiệu suất tuyệt vời:

"SELECT phone FROM user WHERE lower(user_name) like ".srtlower($username);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.