Saya memiliki fungsi yang mengembalikan lima karakter dengan case campuran. Jika saya melakukan kueri pada string ini, ia akan mengembalikan nilai terlepas dari kasusnya.
Bagaimana cara membuat MySQL string kueri case sensitif?
mysql
sql
interop
case-sensitive
string-comparison
StevenB
sumber
sumber
Jawaban:
http://dev.mysql.com/doc/refman/5.0/id/case-sensitivity.html
sumber
SELECT 'email' COLLATE utf8_bin = 'Email'
Berita baiknya adalah jika Anda perlu membuat kueri yang peka terhadap huruf besar-kecil, mudah dilakukan:
sumber
convert(char(0x65,0xcc,0x88) using utf8)
(yaitue
dengan¨
ditambahkan) danconvert(char(0xc3,0xab) using utf8)
(yaituë
), tetapi menambahkanBINARY
akan membuat mereka tidak sama.Jawaban yang diposting oleh Craig White, memiliki penalti kinerja yang besar
karena tidak menggunakan indeks. Jadi, Anda harus mengubah susunan tabel seperti disebutkan di sini https://dev.mysql.com/doc/refman/5.7/id/case-sensitivity.html .
ATAU
Perbaikan termudah, Anda harus menggunakan BINARY dari nilai.
Misalnya.
VS
1 baris dalam set (0,00 dtk)
sumber
Alih-alih menggunakan operator =, Anda mungkin ingin menggunakan LIKE atau LIKE BINARY
Ini akan mengambil 'a' dan bukan 'A' dalam kondisinya
sumber
Untuk menggunakan indeks sebelum menggunakan BINARY, Anda bisa melakukan sesuatu seperti ini jika Anda memiliki tabel besar.
Subquery akan menghasilkan subset case-insensitive yang sangat kecil yang kemudian Anda pilih satu-satunya yang cocok dengan case-sensitive.
sumber
Cara paling benar untuk melakukan perbandingan string peka huruf besar-kecil tanpa mengubah susunan kolom yang ditanyakan adalah dengan secara eksplisit menentukan rangkaian karakter dan susunan untuk nilai yang dibandingkan dengan kolom tersebut.
Kenapa tidak digunakan
binary
?Menggunakan
binary
operator tidak disarankan karena membandingkan byte aktual dari string yang disandikan. Jika Anda membandingkan byte sebenarnya dari dua string yang disandikan menggunakan karakter yang berbeda, set dua string yang harus dianggap sama mereka mungkin tidak sama. Sebagai contoh jika Anda memiliki kolom yang menggunakanlatin1
set karakter, dan set karakter server / sesi Andautf8mb4
, maka ketika Anda membandingkan kolom dengan string yang mengandung aksen seperti 'café' itu tidak akan cocok dengan baris yang berisi string yang sama! Hal ini karena dilatin1
é dikodekan sebagai byte0xE9
tetapiutf8
itu adalah dua byte:0xC3A9
.Mengapa menggunakan
convert
jugacollate
?Collations harus cocok dengan set karakter. Jadi jika server atau sesi Anda diatur untuk menggunakan
latin1
set karakter yang harus Anda gunakancollate latin1_bin
tetapi jika set karakterutf8mb4
Anda harus Anda gunakancollate utf8mb4_bin
. Oleh karena itu solusi yang paling kuat adalah dengan selalu mengubah nilai menjadi set karakter yang paling fleksibel, dan menggunakan susunan biner untuk set karakter itu.Mengapa menerapkan
convert
dancollate
ke nilai dan bukan kolom?Ketika Anda menerapkan fungsi transformasi apa pun ke kolom sebelum membuat perbandingan, itu mencegah mesin kueri dari menggunakan indeks jika ada untuk kolom, yang secara dramatis dapat memperlambat permintaan Anda. Oleh karena itu selalu lebih baik untuk mengubah nilai daripada jika memungkinkan. Ketika perbandingan dilakukan antara dua nilai string dan salah satunya memiliki susunan yang ditentukan secara eksplisit, mesin kueri akan menggunakan susunan eksplisit, terlepas dari nilai mana itu diterapkan.
Sensitivitas Aksen
Penting untuk dicatat bahwa MySql tidak hanya case-insensitive untuk kolom menggunakan
_ci
collation (yang biasanya merupakan default), tetapi juga accent insensitive. Ini artinya'é' = 'e'
. Menggunakan susunan biner (ataubinary
operator) akan membuat perbandingan string menjadi peka aksen dan juga peka huruf besar-kecil.Apa
utf8mb4
?Set
utf8
karakter di MySql adalah aliasutf8mb3
yang sudah tidak digunakan lagi dalam versi terbaru karena tidak mendukung karakter 4 byte (yang penting untuk pengkodean string seperti 🐈). Jika Anda ingin menggunakan pengkodean karakter UTF8 dengan MySql maka Anda harus menggunakanutf8mb4
charset.sumber
Berikut ini untuk versi MySQL yang sama dengan atau lebih tinggi dari 5.5.
Tambahkan ke /etc/mysql/my.cnf
Semua pemeriksaan lain yang saya coba tampaknya tidak peka huruf besar-kecil, hanya "utf8_bin" yang berfungsi.
Jangan lupa untuk me-restart mysql setelah ini:
Menurut http://dev.mysql.com/doc/refman/5.0/id/case-sensitivity.html ada juga "latin1_bin".
"Utf8_general_cs" tidak diterima oleh startup mysql. (Saya membaca "_cs" sebagai "case-sensitive" - ???).
sumber
Anda dapat menggunakan BINARY untuk case sensitif seperti ini
sayangnya sql ini tidak dapat menggunakan indeks, Anda akan mengalami masalah kinerja pada kueri yang bergantung pada indeks itu
Untungnya, saya punya beberapa trik untuk menyelesaikan masalah ini
sumber
Luar biasa!
Saya berbagi dengan Anda, kode dari fungsi yang membandingkan kata sandi:
sumber
declare pSuccess BINARY;
di awalTidak perlu mengubah apa pun pada tingkat DB, cukup Anda harus mengubah SQL Query itu akan berhasil.
Contoh -
"SELECT * FROM <TABLE> where userId = '" + iv_userId + "' AND password = BINARY '" + iv_password + "'";
Kata kunci biner akan membuat case sensitif.
sumber
mysql tidak peka huruf besar-kecil, coba ubah susunan bahasa menjadi
latin1_general_cs
sumber