Frage

Ich arbeite mit einer MySQL-Datenbank, die einige Daten importiert von Excel hat. Die Daten enthalten nicht ASCII Zeichen (em Striche, etc.) sowie versteckter Wagenrücklauf oder Zeilenumbrüche. Gibt es eine Möglichkeit, diese Datensätze mit MySQL zu finden?

War es hilfreich?

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 ';

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top