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?

4voto

Mahmoud Al-Qudsi Punkte 26972

Ausgehend von der richtigen Antwort, aber auch unter Berücksichtigung der ASCII-Steuerzeichen, habe ich folgende Lösung gefunden:

SELECT * FROM `table` WHERE NOT `field` REGEXP  "[\\x00-\\xFF]|^$";

Es macht dasselbe: Es sucht nach Verletzungen des ASCII-Bereichs in einer Spalte, lässt Sie aber auch nach Steuerzeichen suchen, da es die hexadezimale Notation für Codepunkte verwendet. Da es keinen Vergleich oder keine Konvertierung gibt (im Gegensatz zu @Ollies Antwort), sollte dies auch wesentlich schneller sein. (Vor allem, wenn MySQL die Regex-Abfrage vorzeitig abbricht, was es auf jeden Fall tun sollte).

Außerdem wird vermieden, dass Felder mit einer Länge von Null zurückgegeben werden. Wenn Sie eine etwas längere Version wünschen, die möglicherweise besser funktioniert, können Sie stattdessen dies verwenden:

SELECT * FROM `table` WHERE `field` <> "" AND NOT `field` REGEXP  "[\\x00-\\xFF]";

Es wird eine separate Prüfung auf Länge durchgeführt, um Ergebnisse mit einer Länge von Null zu vermeiden, ohne sie für einen Regex-Durchgang zu berücksichtigen. Abhängig von der Anzahl der Null-Längen-Einträge, die Sie haben, könnte dies deutlich schneller sein.

Beachten Sie, dass, wenn Ihr Standardzeichensatz etwas Bizarres ist, bei dem 0x00-0xFF nicht denselben Werten wie ASCII entspricht (gibt es irgendwo einen solchen Zeichensatz?), dies ein falsches Positiv ergeben würde. Ansonsten, viel Spaß!

2voto

Sachin Punkte 36

Verwenden Sie diese Abfrage für die Suche nach Datensätzen mit Sonderzeichen

SELECT *
FROM tableName
WHERE fieldName REGEXP '[^a-zA-Z0-9@:. \'\-`,\&]'

1voto

chiliNUT Punkte 17810

Die Antwort von @zende war die einzige, die Spalten mit einer Mischung aus ASCII- und Nicht-ASCII-Zeichen abdeckte, aber sie hatte auch dieses problematische Hex-Ding. Ich habe dies verwendet:

SELECT * FROM `table` WHERE NOT `column` REGEXP '^[ -~]+$' AND `column` !=''

-1voto

In Oracle können wir folgendes verwenden.

SELECT * FROM TABLE_A WHERE ASCIISTR(COLUMN_A) <> COLUMN_A;

-2voto

Hemen_boro Punkte 5

Für diese Frage können wir auch diese Methode verwenden:

Frage von sql zoo:
Hier finden Sie alle Details zu dem von PETER GRÜNBERG gewonnenen Preis

Nicht-ASCII-Zeichen

ans: select*from nobel where winner like'P% GR%_%berg';

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