sql >> Database >  >> RDS >> Mysql

MySQL:Query's voor Unicode-entiteiten

Nou, dat is alleen double-escaping, maar ja, het werkt en dit is waarom:in MySQL is er een tweede escape-laag wanneer je de LIKE gebruikt telefoniste.

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

het ontleden van die letterlijke MySQL-tekenreeks geeft u een vergelijking met de LIKE-query %L\\u00e4mm\\u00f6n% . Omdat MySQL \ behandelt in een LIKE-query als een escape, die daadwerkelijk overeenkomt met de letterlijke tekenreeks die L\u00e4mm\u00f6n bevat .

De reden hiervoor is dat u strings kunt vergelijken met een query-expressie die een letterlijke % bevat of _ karakter. Als ik bijvoorbeeld in een kolom wil zoeken naar de letterlijke tekenreeks 100% , ik kan het vergelijken met 100\% (geschreven in een zoekopdracht als '100\\%' ) en zorg ervoor dat ik echt honderd procent krijg en alleen geen string die met honderd begint.

Het is jammer dat MySQL backslash gebruikt voor zowel het ontsnappen van LIKE-query's als het letterlijke ontsnappen van de string, vooral gezien het feit dat je waarschijnlijk schrijft in een omsluitende programmeertaal die ze ook gebruikt, wat resulteert in daadwerkelijke drievoudige codering, die eruitziet als "services LIKE '%L\\\\\\\\u00e4mm\\\\\\\\u00f6n%'" - argh!

Het is dubbel jammer, aangezien dit gedrag niet ANSI SQL-conform is en in geen enkele andere database zal werken. ANSI SQL zegt dat er standaard geen escape-teken is in LIKE-query's, dus als u een letterlijke % wilt matchen of _ je moet je aanmelden door een eigen escape-personage te nomineren, bijvoorbeeld:

something LIKE '100=%' ESCAPE '='

Voor compatibiliteit tussen databases is het het beste om altijd de LIKE . te gebruiken ...ESCAPE vorm, en kies iets anders dan de vreselijke backslash! (Terzijde - MySQL's backslashes voor letterlijke SQL-tekenreeksen zijn ook niet ANSI-conform! Maar je kunt dat wangedrag uitschakelen met de NO_BACKSLASH_ESCAPES sql_mode-instelling.)

Waarschijnlijk is het een beter idee om services te verbreken uit in een tweede tabel in plaats van ze in een enkele tekenreekskolom te pletten - dwz. zet je schema in First Normal Form. Dan kunt u eenvoudig individuele waarden opzoeken in plaats van een langzame volledige-tabel-scan substring-match te moeten doen.



  1. Hoe de Oracle-database te controleren op langlopende query's

  2. Hoe weet ik wanneer een MySQL-tabel voor het laatst is bijgewerkt?

  3. Een gids voor MySQL-indexen

  4. android/php record wordt niet ingevoegd in mysql