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?
sumber
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?
secara default, MySQL tidak mempertimbangkan kasus string
Ini tidak sepenuhnya benar. Setiap kali Anda create database
menggunakan 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 |
+----+-------+
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
, 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 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
,, 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%';
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 -1
jika argumen pertama adalah "lebih kecil", 1
jika itu "lebih besar", dan 0
jika "sama", ketika StrComp()=0
, Anda memiliki kecocokan peka huruf besar-kecil.
Ini akan bekerja di MySQL terlepas dari rangkaian karakter. SELECT 'test' REGEXP BINARY 'TEST' SEBAGAI HASIL; Menempatkan 'BINARY' memaksa perbandingan biner.
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);