MySQL: Abfrage von unicode-Entitäten
Ich muss das Wort Lämmönmyyntipalvelut aus der Datenbank. Nur in der Datenbank, die Sie in ein Feld, dessen Wert wurde ein PHP-array umgewandelt in JSON über die Funktionen json_encode() und so werden die Sonderzeichen scrabled in hex-unicode.
Also meine Abfrage ist
SELECT * FROM table WHERE (services LIKE '%Lämmönmyyntipalvelut%')
Keine Ergebnisse. Keine überraschung. Nächste Abfrage mit Sonderzeichen umgewandelt:
SELECT * FROM table WHERE (services LIKE '%L\u00e4mm\u00f6nmyyntipalvelut%')
Keine Ergebnisse und ich Frage mich, warum. Weiter getestet habe ich die Abfrage nur für spezielle Zeichen:
SELECT * FROM table WHERE (services LIKE '%\u00e4%')
Gefunden, was angeblich zu finden. Als Nächstes habe ich begonnen das hinzufügen von Sachen (L zu Anfang), um zu sehen, wo es schief ging:
SELECT * FROM table WHERE (services LIKE '%L\u00e4%')
Keine Ergebnisse. Ein weiterer test:
SELECT * FROM table WHERE (services LIKE '%\u00e4mm%')
Gefunden, was angeblich zu finden.
Also mein Fazit ist, dass der umgekehrte Schrägstrich ist irgendwie Durcheinander, aber ich verstehe nicht, wie?
EDIT:
Genaue Inhalt der Leistungen Bereich:
["Neuvonta","L\u00e4mm\u00f6nmyyntipalvelut",
"Mets\u00e4-\/energiapuunkorjuupalvelut"]
Genauen Abfrage:
SELECT id, uid, company_name, services, logo FROM rekisteroeidy_toimijaks
WHERE
(services LIKE '%L\u00e4mm\u00f6nmyyntipalvelut%' AND
services LIKE '%Mets\u00e4-\/energiapuunkorjuupalvelut%')
ORDER BY company_name ASC
Fügte ich einige Zeilenumbrüche zu helfen, die Lesbarkeit zu verbessern.
json_encode()
d Ergebnis.Du meinst den Inhalt der services-Bereich?
Ja, vielleicht kann jemand erkennen, wo das problem ist.
Hinzugefügt von Bearbeitung.
Von dem, was ich sehe, Vince ' s Antwort sollte dann funktionieren, wenn Sie verdoppelt sich alle backslash `\`
InformationsquelleAutor Simon Josef Kok | 2012-11-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, das ist nur doppelt zu entkommen, aber ja, es funktioniert und hier, warum: in MySQL gibt es eine zweite Schicht der Flucht beteiligt, wenn Sie die
LIKE
Betreiber.Analyse, MySQL string-literal bietet Ihnen einen Vergleich mit dem LIKE-Abfrage
%L\\u00e4mm\\u00f6n%
. Weil MySQL behandelt\
in eine ähnliche Abfrage wie eine Flucht, das wird eigentlich mit der Literale Zeichenfolge, dieL\u00e4mm\u00f6n
.Der Grund dafür ist, so dass Sie übereinstimmen Saiten gegen ein query-Ausdruck, enthält eine wörtliche
%
oder_
Charakter. Zum Beispiel, wenn ich wollen, um eine Spalte zu durchsuchen für die Zeichenkette100%
ich es zuordnen kann gegen100\%
(geschrieben in einer Abfrage, wie'100\\%'
) und stellen Sie sicher, dass ich wirklich immer Einhundert Prozent und nicht nur eine beliebige Zeichenfolge, beginnend mit einem hundert.Es ist bedauerlich, dass MySQL verwendet den umgekehrten Schrägstrich für seine WIE Abfrage der Flucht und seine string-literal zu entkommen, insbesondere angesichts der Tatsache, dass Sie wahrscheinlich schreiben in einem umschließenden Programmiersprache, nutzt Sie auch, enden mit der eigentlichen triple-Codierung, die aussieht wie
"services LIKE '%L\\\\\\\\u00e4mm\\\\\\\\u00f6n%'"
- argh!Ist es doppelt bedauerlich, da dieses Verhalten nicht der ANSI-SQL-konform, und wird nicht funktionieren, in eine andere Datenbank. ANSI-SQL sagt, dass es keine escape-Zeichen im LIKE-Anfragen standardmäßig, also, wenn Sie wollen-match-literal
%
oder_
müssen Sie das opt-in durch die Nominierung ein escape-Zeichen von Ihrem eigenen, wie zB.:Cross-Datenbank-Kompatibilität, ist es am besten stets die
LIKE
...ESCAPE
Formular, und wählen Sie etwas anderes als die schreckliche backslash! (Nebenbei - MySQL backslashes für SQL-string-literal Flucht nicht ANSI-konform! Sie können aber wiederum, dass das Fehlverhalten aus mit dem NO_BACKSLASH_ESCAPES sql_mode Einstellung.)Wahrscheinlich eine bessere Idee sein würde, zu brechen
services
in einer zweiten Tabelle statt quetschen Sie in einer einzigen string-Spalte - ie. setzen Sie Ihr schema in der Ersten Normalform. Dann könnten Sie sich ein einfaches nachschlagen der einzelnen Werte, anstatt Sie zu tun, eine langsame full-table-scan substring-match.SELECT * FROM table WHERE services LIKE BINARY CONCAT('%L', UNHEX('c3a4') ,'mm%');
Auch die binäre addition ist erforderlich, sonst wäre das Ergebnis auch mit "Lamm", ohne diaeresis auf die ein.das ist ein Weg, die übereinstimmung mit einer tatsächlichen
ä
Zeichen (ausgehend von einem UTF-8 collation), wenn Sie nicht geben Sie einfach%Lämm%
direkt, was in Ihrer Umgebung ist. Das ist nicht das, was der OP dabei war - Sie waren versucht, eine tatsächliche umgekehrten Schrägstrich in einigen serialisierte JSON, nicht eine wörtlicheä
. JSON hat\uNNNN
entweicht, auf ein Unicode-Zeichen; SQL Literale selbst nicht.es sollte auch effizienter sein, die zum speichern der
services
Spalte in die Sortierung, die du gehst zu verwenden, um es zu vergleichen, wenn möglich. Das könnte einBINARY
Sortierung wieutf8_bin
wenn Sie wollen, exakt Zeichen; wenn Sie möchten, dass groß-und Kleinschreibung, aber accent-sensitive matching, ist ein erstaunlich missing - Kombination in den Standard-Satz von Sortierungen, obwohl es ein paar böse hacks um ihn herum.Du hast Recht! Habe ich falsch verstanden, die Frage. Ich war auf der Suche nach Beiträge in meiner Datenbank mit einem bestimmten unicode-Zeichen. Durch googeln stieß ich auf diesen Beitrag, aber nicht gründlich gelesen. Anyways vielleicht kann jemand immer noch meine Lösung, wenn Sie nicht die Speicherung von Daten, json-kodiert. In meinem Fall habe ich wissentlich nicht verwenden eine binäre Spalte, in der Lage sein, um einen mit ä usw, wenn jemand nutzt die Suche. Aber manchmal möchte man match ä sich selbst, und dann das hinzufügen der BINÄREN der Abfrage löst das Problem 🙂
InformationsquelleAutor bobince
Der backslash ist ein meta-Zeichen, MySQL verstehen Sie es so : "nehmen Sie den nächsten Charakter und nicht analysieren, es als ein meta-Zeichen".
So müssen Sie escape-backslash :
Nun wird MySQL ersetzen Sie "\\" durch "\" (der erste backslash ist ein meta-Zeichen verwendet, um zu entkommen die zweite)
Wirklich ? In Ihrem "Genaue Abfrage", umgekehrte Schrägstriche sind nicht entgangen. Tut der Flucht jeden backslash, wie löst dies das problem ? : SELECT id, uid, name des Unternehmens, Dienstleistungen, logo AUS rekisteroeidy_toimijaks WO (services LIKE '%L\\u00e4mm\\u00f6nmyyntipalvelut% "UND services WIE" %Mets\\u00e4-\\/energiapuunkorjuupalvelut%') ORDER BY company_name ASC
Wirklich, so komisch wie es klingt. Logisch, deine Antwort ist gut und richtig und macht Sinn, aber ich habe versucht und es funktioniert nicht.
InformationsquelleAutor Vince
Ich habe absolut keine Ahnung warum, aber triple Flucht hilft!
Aber wie kann das sein, abhängig von der Sprache, die ich benutze (es ist PHP, korrigieren), wenn ich genau das gleiche Verhalten mit phpMyAdmin?
Ich habe gerade versucht, es selbst in die Kommandozeile, mysql, und du hast Recht. Ich stehe korrigiert, sorry für die Verwirrung.
Denn wenn Sie die SQL-Anweisung string in einen PHP-string, der string ist entkamen mehrere Zeit : zum ersten mal mit PHP (string Meldung), und zum zweiten mal auf MySQL. So weit wie PHP und viele andere Sprachen (Java, C#...) verwenden Sie den umgekehrten Schrägstrich als Escapezeichen Zeichen, die Sie treffen werden, dieser ärger und brauchen die doppelte Flucht.
InformationsquelleAutor Simon Josef Kok