Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySQL:Meminta entitas unicode

Yah, itu hanya pelolosan ganda, tapi ya itu berhasil dan inilah alasannya:di MySQL, ada pelolosan lapisan kedua yang terlibat saat Anda menggunakan LIKE operator.

services LIKE '%L\\\\u00e4mm\\\\u00f6n%'

parsing bahwa literal string MySQL memberi Anda perbandingan dengan kueri LIKE %L\\u00e4mm\\u00f6n% . Karena MySQL memperlakukan \ dalam kueri LIKE sebagai pelarian, yang sebenarnya akan cocok dengan string literal yang berisi L\u00e4mm\u00f6n .

Alasannya adalah agar Anda dapat mencocokkan string dengan ekspresi kueri yang berisi % literal atau _ karakter. Misalnya jika saya ingin mencari kolom untuk string literal 100% , saya dapat mencocokkannya dengan 100\% (ditulis dalam kueri sebagai '100\\%' ) dan pastikan saya benar-benar mendapatkan seratus persen dan bukan sembarang string yang dimulai dengan seratus.

Sangat disayangkan bahwa MySQL menggunakan garis miring terbalik untuk pelolosan kueri LIKE dan pelolosan string literalnya, terutama mengingat bahwa Anda mungkin menulis dalam bahasa pemrograman terlampir yang juga menggunakannya, berakhir dengan penyandian rangkap tiga yang sebenarnya, yang terlihat seperti "services LIKE '%L\\\\\\\\u00e4mm\\\\\\\\u00f6n%'" - argh!

Sangat disayangkan mengingat bahwa perilaku ini tidak sesuai dengan ANSI SQL, dan tidak akan berfungsi di database lain mana pun. ANSI SQL mengatakan bahwa tidak ada karakter escape dalam kueri LIKE secara default, jadi jika Anda ingin mencocokkan % literal atau _ Anda harus ikut serta dengan menominasikan karakter pelarian Anda sendiri, mis.:

something LIKE '100=%' ESCAPE '='

Untuk kompatibilitas lintas-basis data, yang terbaik adalah selalu menggunakan LIKE ...ESCAPE bentuk, dan pilih sesuatu selain garis miring terbalik yang mengerikan! (Selain itu - garis miring terbalik MySQL untuk pelolosan literal string SQL juga tidak sesuai dengan ANSI! Tetapi Anda dapat menonaktifkan perilaku tersebut dengan pengaturan sql_mode NO_BACKSLASH_ESCAPES.)

Mungkin ide yang lebih baik adalah memecahkan services keluar ke tabel kedua daripada meremasnya menjadi satu kolom string - yaitu. letakkan skema Anda dalam Bentuk Normal Pertama. Kemudian Anda bisa mendapatkan pencarian nilai individual yang sederhana daripada harus melakukan pencocokan substring pemindaian tabel penuh yang lambat.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apa cara terbaik untuk memigrasikan Django DB dari SQLite ke MySQL?

  2. Cara termudah untuk memigrasikan proyek Django dari MySQL ke PostgreSQL

  3. Bagaimana cara menghasilkan UUIDv4 di MySQL?

  4. #1214 - Jenis tabel yang digunakan tidak mendukung indeks FULLTEXT

  5. Apakah kunci utama secara otomatis diindeks di MySQL?