Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL:query per entità Unicode

Bene, questo è solo un doppio escape, ma sì, funziona ed ecco perché:in MySQL, c'è un secondo livello di escape coinvolto quando usi LIKE operatore.

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

l'analisi della stringa MySQL letterale ti dà un confronto con la query LIKE %L\\u00e4mm\\u00f6n% . Perché MySQL tratta \ in una query LIKE come escape, che corrisponderà effettivamente alla stringa letterale contenente L\u00e4mm\u00f6n .

Il motivo è che puoi abbinare le stringhe a un'espressione di query che contiene un valore letterale % o _ carattere. Ad esempio, se voglio cercare in una colonna la stringa letterale 100% , posso confrontarlo con 100\% (scritto in una query come '100\\%' ) e assicurati di ottenere davvero il cento per cento e non qualsiasi stringa che inizi con cento.

È un peccato che MySQL utilizzi la barra rovesciata sia per l'escape della query LIKE che per l'escape letterale delle stringhe, soprattutto perché probabilmente stai scrivendo in un linguaggio di programmazione che li utilizza, finendo con una tripla codifica effettiva, che assomiglia a "services LIKE '%L\\\\\\\\u00e4mm\\\\\\\\u00f6n%'" - argh!

È doppiamente sfortunato dato che questo comportamento non è conforme ANSI SQL e non funzionerà in nessun altro database. ANSI SQL dice che non c'è alcun carattere di escape nelle query LIKE per impostazione predefinita, quindi se vuoi abbinare un % letterale o _ devi acconsentire nominando un tuo carattere di escape, ad es.:

something LIKE '100=%' ESCAPE '='

Per la compatibilità tra database, è sempre meglio usare LIKE ...ESCAPE forma e scegli qualcosa di diverso dall'orribile barra rovesciata! (A parte:le barre inverse di MySQL per l'escape letterale delle stringhe SQL non sono conformi ANSI! Ma puoi disattivare quel comportamento scorretto con l'impostazione NO_BACKSLASH_ESCAPES sql_mode.)

Probabilmente un'idea migliore sarebbe quella di interrompere i services in una seconda tabella piuttosto che schiacciarli in una singola colonna di stringa, ad es. metti il ​​tuo schema in First Normal Form. Quindi potresti ottenere una semplice ricerca di singoli valori invece di dover eseguire una lenta corrispondenza di sottostringhe di scansione completa della tabella.