Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL:Abfragen nach Unicode-Entitäten

Nun, das ist nur Double-Escape, aber ja, es funktioniert und hier ist der Grund:In MySQL gibt es eine zweite Escape-Ebene, wenn Sie LIKE verwenden Betreiber.

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

Wenn Sie dieses MySQL-String-Literal analysieren, erhalten Sie einen Vergleich mit der LIKE-Abfrage %L\\u00e4mm\\u00f6n% . Weil MySQL \ behandelt in einer LIKE-Abfrage als Escapezeichen, das tatsächlich mit der Literalzeichenfolge übereinstimmt, die L\u00e4mm\u00f6n enthält .

Der Grund dafür ist, dass Sie Zeichenfolgen mit einem Abfrageausdruck abgleichen können, der einen wörtlichen % enthält oder _ Charakter. Zum Beispiel, wenn ich eine Spalte nach der wörtlichen Zeichenfolge 100% durchsuchen möchte , kann ich es mit 100\% abgleichen (in einer Abfrage geschrieben als '100\\%' ) und stellen Sie sicher, dass ich wirklich hundert Prozent bekomme und nur keine Zeichenfolge, die mit hundert beginnt.

Es ist bedauerlich, dass MySQL Backslash sowohl für das Maskieren von LIKE-Abfragen als auch für das Maskieren von Zeichenfolgenliteralen verwendet, insbesondere angesichts der Tatsache, dass Sie wahrscheinlich in einer einschließenden Programmiersprache schreiben, die sie ebenfalls verwendet, was zu einer tatsächlichen Dreifachcodierung führt, die wie "services LIKE '%L\\\\\\\\u00e4mm\\\\\\\\u00f6n%'" - argh!

Es ist doppelt bedauerlich, da dieses Verhalten nicht ANSI SQL-konform ist und in keiner anderen Datenbank funktioniert. ANSI SQL sagt, dass es standardmäßig kein Escape-Zeichen in LIKE-Abfragen gibt, wenn Sie also einen wörtlichen % finden möchten oder _ Sie müssen sich anmelden, indem Sie einen eigenen Escape-Charakter benennen, z. B.:

something LIKE '100=%' ESCAPE '='

Für datenbankübergreifende Kompatibilität ist es am besten, immer den LIKE zu verwenden ...ESCAPE form, und wählen Sie etwas anderes als den schrecklichen Backslash! (Nebenbei – MySQLs Backslashes für SQL-String-Literal-Escapezeichen sind auch nicht ANSI-konform! Aber Sie können dieses Fehlverhalten mit der sql_mode-Einstellung NO_BACKSLASH_ESCAPES ausschalten.)

Wahrscheinlich wäre es eine bessere Idee, services zu unterbrechen in eine zweite Tabelle ausgeben, anstatt sie in eine einzelne Zeichenfolgenspalte zu quetschen - dh. Bringen Sie Ihr Schema in die erste Normalform. Dann könnten Sie eine einfache Suche nach einzelnen Werten erhalten, anstatt einen langsamen Full-Table-Scan-Substring-Match durchführen zu müssen.