Dalam database kami, kami memiliki banyak entri dengan caron / hatschek. Sekarang pengguna kami ingin menemukan entri termasuk caron / hatschek ketika mereka mencari entri tanpa. Saya akan menunjukkan ini dengan contoh sederhana:
Dalam database kami, kami memiliki entri (kontak dengan nama)
Millière
jadi nama ini benar di negara tempat orang tersebut tinggal.
Di negara kami, kami tidak memiliki karakter dengan caron / hatschek, oleh karena itu pengguna kami mencari Milliere
. Tidak ada hasil yang muncul, karena è
jelas tidak cocok e
.
Saya tidak tahu bagaimana ini bisa direalisasikan sebagai é
, è
, ê
dan banyak lagi yang tersedia (dan ini hanya contoh surat e
...).
(Cara lain akan jauh lebih mudah, karena saya dapat dengan mudah mengganti semua huruf dengan caron / hatschek dengan yang dasar. Jelas, pengguna kami memang menginginkan versi yang benar dari nama dalam database, bukan yang cacat.)
Jawaban:
Masalah ini dapat diatasi dengan menggunakan aksen peka aksen .
Basis data Anda mungkin menggunakan susunan AS (Sensent Sensitive) sehingga secara default akan mencari kecocokan yang tepat termasuk aksen.
Anda bisa menginstruksikan klausa WHERE untuk menggunakan collation lain dari default database dengan menentukan collation dengan perbandingan.
Di dbfiddle ini saya membuat contoh menggunakan collations LATIN1 tetapi Anda bisa menggunakan pendekatan yang sama dengan collation yang Anda gunakan dengan hanya mengubah AS menjadi AI untuk collation yang sedang digunakan kolom Anda.
Gunakan collation Accent Insensitive yang cocok dengan collation yang digunakan colummn. Misalnya jika kolom menggunakan
SQL_Latin1_General_CP1_CI_AS
, gunakanSQL_Latin1_General_CP1_CI_AI
dan tidakLatin1_General_CI_AS
atauLatin1_General_100_CI_AS
salah satu variasi dari keduanya karena perilaku non-SQL_ collations akan berbeda dalam banyak hal lebih dari sekadar aksen-ketidakpekaan, dan yang mungkin tidak diharapkan oleh pengguna.Anda dapat memeriksa susunan saat ini di
sys.columns
.Baca melalui Menggunakan SQL Server Collations untuk informasi lebih lanjut.
Kemudian lagi, Anda mungkin ingin menyortir untuk menggunakan susunan ini (seperti yang dicatat oleh peufeu dalam komentar) untuk memastikan bahwa "é" cocok dengan "e". Jika tidak, seseorang yang membuat paginasi melalui hasil dalam urutan abjad akan terkejut tidak menemukan "é" di mana mereka mengharapkannya, tetapi jika Anda hanya ingin menyentuh kueri ini, Anda dapat menambahkan
COLLATE
klausa keORDER BY
juga.Seperti dicatat oleh Solomon Rutzky dalam komentar, jika ini hanya mempengaruhi 1 atau beberapa kolom, opsi lain adalah membuat kolom yang dihitung tidak-persisten yang hanya mengulangi kolom "nama" dan memberikan susunan tidak sensitif aksen, dan kemudian mengindeks yang dihitung kolom. Ini menghindari pemindaian yang disebabkan oleh perubahan susunan di dalam kueri. Maka permintaan perlu memfilter pada kolom baru.
Sesuatu seperti:
Atau Anda juga bisa membuat tampilan alih-alih menambahkan kolom yang dihitung (seperti yang dipilih jyao ).
sumber
SQL_Latin1_General_CP1_CI_AS
, menggunakan ,SQL_Latin1_General_CP1_CI_AI
dan bukanLatin1_General_CI_AS
atauLatin1_General_100_CI_AS
atau salah satu variasi dari keduanya karena perilaku non-SQL_
koleksi akan berbeda dalam lebih banyak cara daripada hanya ketidakpekaan aksen, dan yang mungkin tidak diharapkan oleh pengguna. Kolasi ditemukan disys.columns
.