Bagaimana cara melakukan pencarian case sensitif dalam klausa WHERE?

21

Saya ingin pencarian sensitif huruf dalam kueri SQL. Tetapi secara default, MySQL tidak mempertimbangkan kasus string.

Adakah ide tentang bagaimana melakukan pencarian case-sensitive dalam SQL query?

Somnath Muluk
sumber

Jawaban:

22

secara default, MySQL tidak mempertimbangkan kasus string

Ini tidak sepenuhnya benar. Setiap kali Anda create databasemenggunakan MySQL, basis data / skema memiliki rangkaian karakter dan kumpulan. Setiap rangkaian karakter memiliki susunan standar; lihat di sini untuk informasi lebih lanjut.

Susunan standar untuk rangkaian karakter latin1, yaitu latin1_swedish_ci, tidak peka huruf besar-kecil.

Anda dapat memilih susunan case-sensitive, misalnya latin1_general_cs( tata bahasa MySQL ):

CREATE SCHEMA IF NOT EXISTS `myschema` 
DEFAULT CHARACTER SET latin1 
COLLATE latin1_general_cs ;

Ini berdampak pada hal-hal seperti pengelompokan dan kesetaraan. Sebagai contoh,

create table casetable (
  id int primary key, 
  thing varchar(50)
);

select * from casetable;
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
|  4 | ABC   |
|  5 | aBc   |
|  6 | abC   |
+----+-------+

Dalam database case-sensitive, kita mendapatkan:

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   |
+----+-------+

Sementara dalam database case-insensitive, kita mendapatkan:

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   |
+----+-------+

Perhatikan bahwa Anda juga bisa mengubah susunan dari dalam kueri . Sebagai contoh, dalam database case- sensitive , saya bisa melakukannya

select * from casetable where thing collate latin1_swedish_ci = "abc";
+----+-------+
| id | thing |
+----+-------+
|  3 | abc   |
|  4 | ABC   |
|  5 | aBc   |
|  6 | abC   |
+----+-------+
Matt Fenwick
sumber
13

Anda harus selalu menyatakan dengan pertanyaan apa versi MySQL yang Anda gunakan, karena MySQL sedang dalam pengembangan.

Oke, kembali ke pertanyaan Anda:

Fungsi string di MySQL selalu case sensitive, sehingga Anda bisa menggunakan salah satu fungsi LOCATE, POSITIONatau INSTR.

Sebagai contoh:

SELECT phone FROM user WHERE POSITION('term' IN user_name)>0;

Pola yang cocok dengan ekspresi reguler ( RLIKEatau REGEXP) selalu case-sensitive untuk semua versi MySQL kecuali yang terbaru 3.23.4.

Sebagai contoh:

SELECT phone FROM user WHERE user_name REGEXP 'term';

Untuk perbandingan normal (=) dan pencocokan pola SQL ( LIKE) perilaku tergantung pada bidang yang terlibat:

Sebuah. CHAR,, VARCHARdan semua varian bidang TEXT membandingkan peka huruf besar kecil.

b. CHAR BINARY, VARCHAR BINARY dan semua varian bidang BLOB membandingkan sensitif huruf.

Jika Anda membandingkan bidang dari (a) dengan bidang dari (b), maka perbandingannya akan peka huruf besar-kecil (sensitivitas huruf menang). Lihat bab "7.2.7 Jenis string" dari Manual Referensi MySQL dan cari pernyataan tentang penyortiran dan perbandingan.

Dimulai dengan V3.23.0 juga dimungkinkan untuk memaksa perbandingan ke sensitivitas case dengan operator cast BINARY, terlepas dari jenis bidang yang terlibat. Lihat bab "7.3.7 Operator cor" dari Manual Referensi MySQL.

Jadi, Anda juga dapat mengubah jenis user_name, atau dengan V3.23.x coba sesuatu seperti:

SELECT phone FROM user WHERE BINARY username LIKE '%term%';
Turgut
sumber
1

Dalam situasi saya , saya menggunakan Access 2010, tetapi saya memiliki masalah yang sama namun solusinya berbeda: Gunakan StrComp()fungsi dan uji kembalinya menjadi nol.

StrComp( thing, 'abc', 0) = 0

Karena StrComp()kembali -1jika argumen pertama adalah "lebih kecil", 1jika itu "lebih besar", dan 0jika "sama", ketika StrComp()=0, Anda memiliki kecocokan peka huruf besar-kecil.

Lihat di sini , di sini atau di sini .

Martin F
sumber
0

Ini akan bekerja di MySQL terlepas dari rangkaian karakter. SELECT 'test' REGEXP BINARY 'TEST' SEBAGAI HASIL; Menempatkan 'BINARY' memaksa perbandingan biner.

pengguna2288580
sumber
-2

Coba ini untuk pencarian yang tidak sensitif, ini berfungsi dengan baik dengan kinerja luar biasa:

"SELECT phone FROM user WHERE lower(user_name) like ".srtlower($username);
ganji
sumber