147 Stimmen

Wie kann ich Nicht-ASCII-Zeichen in MySQL finden?

Ich arbeite mit einer MySQL-Datenbank, die einige Daten importiert hat aus Excel . Die Daten enthalten nicht ASCII Zeichen (Bindestriche usw.) sowie versteckte Wagenrückläufe oder Zeilenvorschübe. Gibt es eine Möglichkeit, diese Datensätze mit MySQL zu finden?

299voto

O. Jones Punkte 90877

MySQL bietet eine umfassende Zeichensatzverwaltung, die bei dieser Art von Problem helfen kann.

SELECT whatever
  FROM tableName 
 WHERE columnToCheck <> CONVERT(columnToCheck USING ASCII)

En CONVERT(col USING charset) werden die nicht konvertierbaren Zeichen in Ersatzzeichen umgewandelt. Dann sind der konvertierte und der nicht konvertierte Text ungleich.

Weitere Informationen hierzu finden Sie hier. https://dev.mysql.com/doc/refman/8.0/en/charset-repertoire.html

Sie können jeden beliebigen Zeichensatznamen anstelle von ASCII verwenden. Wenn Sie zum Beispiel herausfinden wollen, welche Zeichen in der Codepage 1257 (Litauisch, Lettisch, Estnisch) nicht korrekt dargestellt werden, verwenden Sie CONVERT(columnToCheck USING cp1257)

94voto

zende Punkte 1017

Sie können ASCII als alle Zeichen definieren, die einen Dezimalwert von 0 - 127 (0x00 - 0x7F) haben, und Spalten mit Nicht-ASCII-Zeichen mit der folgenden Abfrage finden

SELECT * FROM TABLE WHERE NOT HEX(COLUMN) REGEXP '^([0-7][0-9A-F])*$';

Dies war die umfassendste Anfrage, die ich stellen konnte.

74voto

Chad Birch Punkte 70946

Es hängt davon ab, was genau Sie als "ASCII" definieren, aber ich würde vorschlagen, eine Variante einer Abfrage wie diese zu versuchen:

SELECT * FROM tableName WHERE columnToCheck NOT REGEXP '[A-Za-z0-9]';

Diese Abfrage gibt alle Zeilen zurück, in denen columnToCheck irgendwelche nicht-alphanumerischen Zeichen enthält. Wenn Sie andere zulässige Zeichen haben, fügen Sie diese der Zeichenklasse im regulären Ausdruck hinzu. Wenn zum Beispiel Punkte, Kommas und Bindestriche zulässig sind, ändern Sie die Abfrage in:

SELECT * FROM tableName WHERE columnToCheck NOT REGEXP '[A-Za-z0-9.,-]';

Die wichtigste Seite in der MySQL-Dokumentation ist wahrscheinlich 12.5.2 Reguläre Ausdrücke .

55voto

Das ist wahrscheinlich das, wonach Sie suchen:

select * from TABLE where COLUMN regexp '[^ -~]';

Sie sollte alle Zeilen zurückgeben, in denen SPALTE Nicht-ASCII-Zeichen (oder nicht druckbare ASCII-Zeichen wie Zeilenumbrüche) enthält.

15voto

Rob Bailey Punkte 1657

Ein Zeichen, das in den obigen Beispielen fehlt, ist das Abschlusszeichen ( \0 ). Diese ist in der Ausgabe der MySQL-Konsole unsichtbar und kann mit keiner der oben genannten Abfragen gefunden werden. Die Abfrage, um es zu finden, ist einfach:

select * from TABLE where COLUMN like '%\0%';

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X