Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL:zapytania dotyczące jednostek Unicode

Cóż, to tylko podwójna ucieczka, ale tak, to działa i oto dlaczego:w MySQL istnieje druga warstwa ucieczki, gdy używasz LIKE operatora.

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

parsowanie tego literału napisowego MySQL daje porównanie z zapytaniem LIKE %L\\u00e4mm\\u00f6n% . Ponieważ MySQL traktuje \ w zapytaniu LIKE jako escape, który w rzeczywistości będzie pasował do dosłownego ciągu zawierającego L\u00e4mm\u00f6n .

Powodem tego jest to, że możesz dopasować ciągi do wyrażenia zapytania, które zawiera dosłowny % lub _ postać. Na przykład, jeśli chcę wyszukać w kolumnie ciąg dosłowny 100% , mogę dopasować to do 100\% (zapisany w zapytaniu jako '100\\%' ) i upewnij się, że naprawdę otrzymuję sto procent i po prostu nie mam żadnego ciągu zaczynającego się od stu.

To niefortunne, że MySQL używa odwrotnego ukośnika zarówno do ucieczki dla zapytania LIKE, jak i dla ucieczki literału ciągu, zwłaszcza biorąc pod uwagę, że prawdopodobnie piszesz w otaczającym języku programowania, który również ich używa, co kończy się rzeczywistym potrójnym kodowaniem, które wygląda jak "services LIKE '%L\\\\\\\\u00e4mm\\\\\\\\u00f6n%'" - argh!

Jest to podwójnie niefortunne, biorąc pod uwagę, że to zachowanie nie jest zgodne z ANSI SQL i nie będzie działać w żadnej innej bazie danych. ANSI SQL mówi, że domyślnie w zapytaniach LIKE nie ma znaku ucieczki, więc jeśli chcesz dopasować dosłowny % lub _ musisz wyrazić zgodę, wyznaczając własną postać ucieczki, np.:

something LIKE '100=%' ESCAPE '='

Aby zapewnić zgodność między bazami danych, najlepiej zawsze używać LIKE ...ESCAPE formularz i wybierz coś innego niż okropny odwrotny ukośnik! (Na marginesie - odwrotne ukośniki MySQL dla literowych znaków ucieczki SQL również nie są zgodne z ANSI! Ale możesz wyłączyć to niewłaściwe zachowanie za pomocą ustawienia NO_BACKSLASH_ESCAPES sql_mode.)

Prawdopodobnie lepszym pomysłem byłoby zerwanie services do drugiej tabeli, zamiast zgniatać je w kolumnie z pojedynczym ciągiem - tj. umieść swój schemat w pierwszej formie normalnej. Wtedy możesz uzyskać proste wyszukiwanie poszczególnych wartości, zamiast wykonywać powolne skanowanie podciągów w pełnej tabeli.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLAlchemy/MySQL Utracono połączenie z serwerem MySQL podczas zapytania

  2. Jak mogę debugować, dlaczego najprostsze zapytanie MySQL zwraca false?

  3. Jaka jest wada korzystania z pola o rozmiarze długiego tekstu MySQL, gdy każdy wpis zmieści się w polu o rozmiarze średniej długości tekstu?

  4. LEWE DOŁĄCZ w ZF2 za pomocą TableGateway

  5. Zablokuj tabelę mysql za pomocą php