sql >> Databáze >  >> RDS >> Mysql

MySQL:Dotazování na entity Unicode

No, to je pouze dvojité escapování, ale ano, funguje to a zde je důvod:v MySQL je při použití LIKE zahrnuta druhá vrstva escapování operátor.

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

analýza tohoto řetězcového literálu MySQL vám poskytne srovnání s dotazem LIKE %L\\u00e4mm\\u00f6n% . Protože MySQL zachází s \ v dotazu LIKE jako escape, který bude ve skutečnosti odpovídat doslovnému řetězci obsahujícímu L\u00e4mm\u00f6n .

Důvodem je to, že můžete porovnat řetězce s výrazem dotazu, který obsahuje doslovný % nebo _ charakter. Například pokud chci ve sloupci vyhledat doslovný řetězec 100% , mohu to porovnat s 100\% (zapsáno v dotazu jako '100\\%' ) a ujistěte se, že dostanu opravdu sto procent, a ne žádný řetězec začínající stovkou.

Je nešťastné, že MySQL používá zpětné lomítko pro escapování LIKE dotazu i escapování řetězcového doslovného escapování, zejména vzhledem k tomu, že pravděpodobně píšete v uzavřeném programovacím jazyce, který je také používá, což končí skutečným trojitým kódováním, které vypadá jako "services LIKE '%L\\\\\\\\u00e4mm\\\\\\\\u00f6n%'" - Argh!

Je to dvojnásob nešťastné vzhledem k tomu, že toto chování není v souladu s ANSI SQL a nebude fungovat v žádné jiné databázi. ANSI SQL říká, že ve výchozím nastavení není v dotazech LIKE žádný znak escape, takže pokud chcete najít doslovný % nebo _ musíte se přihlásit nominováním své vlastní únikové postavy, např.:

something LIKE '100=%' ESCAPE '='

Pro kompatibilitu mezi databázemi je nejlepší vždy použít LIKE ...ESCAPE formulář a vyberte si něco jiného než to hrozné zpětné lomítko! (Pomineme-li – zpětná lomítka MySQL pro escapování řetězcového literálu SQL také nejsou v souladu s ANSI! Ale toto špatné chování můžete vypnout nastavením NO_BACKSLASH_ESCAPES sql_mode.)

Pravděpodobně lepší nápad by bylo přerušit services do druhé tabulky spíše než je stlačit do jednoho sloupce řetězce - tzn. vložte schéma do prvního normálního formuláře. Pak byste mohli získat jednoduché vyhledávání jednotlivých hodnot místo toho, abyste museli provádět pomalé porovnávání podřetězců při úplném skenování tabulky.



  1. Mysql objednávejte položky do nejnovějšího ze 2 dat

  2. Jak porovnat data mezi dvěma databázemi v PostgreSQL?

  3. mysql zobrazuje dostupné časové úseky a obsazené časové úseky z tabulky

  4. NHibernate IPreUpdateEventListener, IPreInsertEventListener se neukládá do DB