Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL:Запитване за Unicode обекти

Е, това е само двойно екраниране, но да, работи и ето защо:в MySQL има втори слой на екраниране, когато използвате LIKE оператор.

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

анализирането на този литерал на MySQL низ ви дава сравнение с LIKE-заявката %L\\u00e4mm\\u00f6n% . Тъй като MySQL третира \ в LIKE заявка като escape, това всъщност ще съвпада с литерален низ, съдържащ L\u00e4mm\u00f6n .

Причината за това е, за да можете да съпоставите низове с израз на заявка, който съдържа литерал % или _ характер. Например, ако искам да търся колона за литералния низ 100% , мога да го съпоставя с 100\% (написано в заявка като '100\\%' ) и се уверете, че наистина получавам сто процента, а не някакъв низ, започващ със сто.

Жалко е, че MySQL използва обратна наклонена черта както за екранирането на заявката LIKE, така и за избягването на литерала на низ, особено като се има предвид, че вероятно пишете на затворен език за програмиране, който също ги използва, завършвайки с действително тройно кодиране, което изглежда като "services LIKE '%L\\\\\\\\u00e4mm\\\\\\\\u00f6n%'" - ах!

Това е двойно жалко, като се има предвид, че това поведение не е съвместимо с ANSI SQL и няма да работи в никоя друга база данни. ANSI SQL казва, че в заявките LIKE по подразбиране няма escape-символ, така че ако искате да съпоставите литерал % или _ трябва да се включите, като номинирате свой собствен символ за бягство, напр.:

something LIKE '100=%' ESCAPE '='

За съвместимост между бази данни е най-добре винаги да използвате LIKE ...ESCAPE форма и изберете нещо различно от ужасната обратна наклонена черта! (Отстрани – обратните наклонени черти на MySQL за избягване на литерал на SQL низ също не са съвместими с ANSI! Но можете да изключите това лошо поведение с настройката NO_BACKSLASH_ESCAPES sql_mode.)

Вероятно по-добра идея би била да разбиете services във втора таблица, вместо да ги смачквате в колона с един низ - т.е. поставете вашата схема в Първа нормална форма. Тогава бихте могли да получите просто търсене на индивидуални стойности, вместо да се налага да правите бавно съвпадение на поднизове при сканиране на цяла таблица.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mysql Как се създава клъстериран индекс?

  2. Как да поправите MySQL база данни в cPanel

  3. Интеграция на WordPress MediaWiki

  4. Изчислете децил от актуалност в MySQL

  5. Защо executemany е бавно в Python MySQLdb?