it-swarm.asia

Bagaimana cara melakukan pencarian case sensitif dalam klausa WHERE?

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?

22
Somnath Muluk

secara default, MySQL tidak mempertimbangkan kasus string

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

Susunan standar untuk rangkaian karakter latin1, yang mana 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 dapat mengubah susunan dari dalam kueri . Sebagai contoh, dalam kasus - database sensitif , saya dapat melakukannya

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

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 peka huruf besar-kecil, sehingga Anda dapat menggunakan salah satu fungsi LOCATE, POSITION, atau INSTR.

Sebagai contoh:

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

Pola yang cocok dengan ekspresi reguler (RLIKE atau REGEXP) selalu peka huruf besar-kecil 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, VARCHAR, dan 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%';
15
Turgut

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

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

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

Lihat di sini , di sini atau di sini .

1
Martin F

Ini akan bekerja di MySQL terlepas dari rangkaian karakter.

SELECT 'test' REGEXP BINARY 'TEST' AS RESULT;

Menempatkan 'BINARY' memaksa perbandingan biner.

1
user2288580