Wie kann ich nicht-ASCII-Zeichen in MySQL finden?
-
03-07-2019 - |
Lösung
Es hängt genau das, was man als „ASCII“ ist definiert, aber ich würde vorschlagen, eine Variante einer Abfrage wie folgt versucht:
SELECT * FROM tableName WHERE columnToCheck NOT REGEXP '[A-Za-z0-9]';
Diese Abfrage wird alle Zeilen zurück, wo columnToCheck alle nicht-alphanumerische Zeichen enthält. Wenn Sie andere Zeichen, die akzeptabel sind, fügen Sie sie in der Zeichenklasse im regulären Ausdruck. Wenn zum Beispiel Punkte, Kommas und Bindestriche in Ordnung sind, ändern Sie die Abfrage an:
SELECT * FROM tableName WHERE columnToCheck NOT REGEXP '[A-Za-z0-9.,-]';
Die entsprechende Seite der MySQL-Dokumentation ist wahrscheinlich 12.5.2 Reguläre Ausdrücke .
Andere Tipps
MySQL bietet umfassendes Zeichensatz-Management, das mit dieser Art von Problem helfen kann.
SELECT whatever
FROM tableName
WHERE columnToCheck <> CONVERT(columnToCheck USING ASCII)
Die CONVERT(col USING charset)
Funktion schaltet die unconvertable Zeichen in Ersatzzeichen. Dann wird die umgewandelte und nicht umgesetzten Text ungleich sein.
Sehen Sie für weitere Diskussion dieses. https://dev.mysql.com/doc/refman/8.0 /en/charset-repertoire.html
Sie können einen beliebigen Zeichensatz-Namen verwenden Sie anstelle von ASCII möchten. Zum Beispiel, wenn Sie die Zeichen herausfinden möchten, wird nicht korrekt in Codepage 1257 (Litauisch, Lettisch, Estnisch) machen CONVERT(columnToCheck USING cp1257)
verwenden
Sie können ASCII als alle Zeichen definieren, die einen Dezimal-Wert von 0 - 127 (0x00 - 0x7F) und finden Sie Spalten mit Nicht-ASCII-Zeichen der folgenden Abfrage mit
SELECT * FROM TABLE WHERE NOT HEX(COLUMN) REGEXP '^([0-7][0-9A-F])*$';
Dies war die umfassendste Abfrage, die ich tun konnte.
Dies ist wahrscheinlich das, was Sie suchen:
select * from TABLE where COLUMN regexp '[^ -~]';
Es sollten alle Zeilen zurück, wo COLUMN Nicht-ASCII-Zeichen (oder nicht-druckbaren ASCII-Zeichen wie Newline) enthält.
Ein fehlendes Zeichen aus alles oben genannten Beispielen ist das Abschlusszeichen (\ 0). Dies ist unsichtbar für die Ausgabe der Konsole MySQL und ist nicht auffindbar durch irgendeine der Abfragen bisher erwähnt. Die Abfrage, es zu finden ist einfach:
select * from TABLE where COLUMN like '%\0%';
auf der richtigen Antwort Basierend, sondern auch Konto ASCII-Steuerzeichen nehmen in der Lösung, die für mich gearbeitet, ist dies:
SELECT * FROM `table` WHERE NOT `field` REGEXP "[\\x00-\\xFF]|^$";
Es tut das Gleiche: sucht nach Verletzungen des ASCII-Bereichs in einer Spalte, sondern lässt sich auch für Steuerzeichen suchen, da es hexadezimale Notation für Codepunkte verwendet. Da es keinen Vergleich oder Umwandlung ist (im Gegensatz zu @ Ollies Antwort), sollte dies deutlich schneller sein, auch. (Vor allem, wenn MySQL tut frühe Terminierung auf der regex Abfrage, die es sollte auf jeden Fall.)
Es vermeidet auch Felder, die Rückkehr der Länge Null sind. Wenn Sie eine etwas längere Version-wollen, die eine bessere Leistung könnte, können Sie diese verwenden, anstatt:
SELECT * FROM `table` WHERE `field` <> "" AND NOT `field` REGEXP "[\\x00-\\xFF]";
Es macht einen separaten Check für Länge der Länge Null Ergebnisse zu vermeiden, ohne dass sie für einen regulären Ausdruck Pass zu berücksichtigen. In Abhängigkeit von der Anzahl der Null-Länge Einträge, die Sie haben, könnte dies erheblich schneller sein.
Beachten Sie, dass, wenn Ihr Standardzeichensatz ist etwas bizarr, wo 0x00-0xFF auf die gleichen Werte wie ASCII Karte nicht (gibt es so ein Charakter in Existenz gesetzt überall?), Würde dies eine falsche positive zurückzukehren. Ansonsten genießen!
Diese Abfrage verwendet für die Suche Sonderzeichen Aufzeichnungen
SELECT *
FROM tableName
WHERE fieldName REGEXP '[^a-zA-Z0-9@:. \'\-`,\&]'
@ Zende Antwort war die einzige, die Spalten mit einer Mischung aus ascii und nicht ASCII-Zeichen bedeckt, aber es hatte auch insofern problematisch, hex Sache. Ich habe diese:
SELECT * FROM `table` WHERE NOT `column` REGEXP '^[ -~]+$' AND `column` !=''
In Oracle können wir unten.
SELECT * FROM TABLE_A WHERE ASCIISTR(COLUMN_A) <> COLUMN_A;
für diese Frage können wir auch diese Methode verwenden:
Frage von SQL-Zoo:
Alle Details des Preises gewonnen von Peter Grünberg
Nicht-ASCII-Zeichen
ans: select * from nobel, wo Sieger like'P% GR% _% Berg ';