Ich arbeite mit einer MySQL-Datenbank, in die einige Daten aus Excel importiert wurden . Die Daten enthalten Nicht- ASCII- Zeichen (Bindestriche usw.) sowie versteckte Zeilenumbrüche oder Zeilenvorschübe. Gibt es eine Möglichkeit, diese Datensätze mit MySQL zu finden?
mysql
character-encoding
Ed Mays
quelle
quelle
Antworten:
Es hängt genau davon ab, was Sie als "ASCII" definieren, aber ich würde vorschlagen, eine Variante einer Abfrage wie diese zu versuchen:
Diese Abfrage gibt alle Zeilen zurück, in denen columnToCheck nicht alphanumerische Zeichen enthält. Wenn Sie andere Zeichen haben, die akzeptabel sind, fügen Sie sie der Zeichenklasse im regulären Ausdruck hinzu. Wenn beispielsweise Punkte, Kommas und Bindestriche in Ordnung sind, ändern Sie die Abfrage in:
Die relevanteste Seite der MySQL-Dokumentation ist wahrscheinlich 12.5.2 Reguläre Ausdrücke .
quelle
SELECT * FROM tbl WHERE colname NOT REGEXP '^[A-Za-z0-9\.,@&\(\) \-]*$';
MySQL bietet eine umfassende Zeichensatzverwaltung, die bei solchen Problemen helfen kann.
Das
CONVERT(col USING charset)
Funktion wandelt die nicht konvertierbaren Zeichen in Ersatzzeichen um. Dann sind der konvertierte und der nicht konvertierte Text ungleich.Weitere Informationen finden Sie hier. https://dev.mysql.com/doc/refman/8.0/en/charset-repertoire.html
Sie können anstelle von ASCII einen beliebigen Zeichensatznamen verwenden. Wenn Sie beispielsweise herausfinden möchten, welche Zeichen in Codepage 1257 (Litauisch, Lettisch, Estnisch) nicht korrekt gerendert werden, verwenden Sie
CONVERT(columnToCheck USING cp1257)
quelle
Sie können ASCII als alle Zeichen mit einem Dezimalwert von 0 - 127 (0x00 - 0x7F) definieren und mithilfe der folgenden Abfrage Spalten mit Nicht-ASCII-Zeichen suchen
Dies war die umfassendste Abfrage, die ich erstellen konnte.
quelle
SELECT * FROM table WHERE LENGTH( column ) != CHAR_LENGTH( column )
'ā'
(codiert durch die Bytesequenz0x0101
) - es würde mit diesem Test als "ASCII" betrachtet: ein falsches Negativ ; In der Tat codieren einige Zeichensätze keine ASCII-Zeichen0x00
,0x7f
woraufhin diese Lösung ein falsches Positiv ergeben würde. Verlassen Sie sich nicht auf diese Antwort!LENGTH(column)
ein konstantes Vielfaches vonCHAR_LENGTH(column)
.Dies ist wahrscheinlich das, wonach Sie suchen:
Es sollte alle Zeilen zurückgeben, in denen COLUMN Nicht-ASCII-Zeichen (oder nicht druckbare ASCII-Zeichen wie Zeilenumbrüche) enthält.
quelle
REGEXP
undRLIKE
arbeiten byteweise, sind also nicht mehrbytesicher und können mit Mehrbyte-Zeichensätzen zu unerwarteten Ergebnissen führen. Außerdem vergleichen diese Operatoren die Zeichen anhand ihrer Bytewerte und Zeichen mit Akzent werden möglicherweise nicht als gleich verglichen, selbst wenn eine bestimmte Zusammenstellung sie als gleich behandelt. "Ein fehlendes Zeichen in allen obigen Beispielen ist das Abschlusszeichen (\ 0). Dies ist für die MySQL-Konsolenausgabe unsichtbar und kann von keiner der oben genannten Abfragen erkannt werden. Die Abfrage, um es zu finden, ist einfach:
quelle
Basierend auf der richtigen Antwort, aber auch unter Berücksichtigung der ASCII-Steuerzeichen, hat sich für mich folgende Lösung bewährt:
Es funktioniert genauso: Es wird in einer Spalte nach Verstößen gegen den ASCII-Bereich gesucht, aber Sie können auch nach Steuerzeichen suchen, da für Codepunkte die hexadezimale Notation verwendet wird. Da es keinen Vergleich oder keine Konvertierung gibt (im Gegensatz zu @ Ollie's Antwort), sollte dies auch deutlich schneller sein. (Vor allem, wenn MySQL die Regex-Abfrage vorzeitig beendet, was auf jeden Fall der Fall sein sollte.)
Außerdem wird vermieden, dass Felder mit der Länge Null zurückgegeben werden. Wenn Sie eine etwas längere Version wünschen, die möglicherweise eine bessere Leistung erzielt, können Sie stattdessen Folgendes verwenden:
Es wird eine separate Längenprüfung durchgeführt, um Ergebnisse mit einer Länge von Null zu vermeiden, ohne sie für einen Regex-Durchlauf zu berücksichtigen. Abhängig von der Anzahl der Einträge mit der Länge Null kann dies erheblich schneller sein.
Beachten Sie, dass wenn Ihr Standardzeichensatz etwas Seltsames ist, bei dem 0x00-0xFF nicht denselben Werten wie ASCII zugeordnet ist (gibt es irgendwo einen solchen Zeichensatz?), Dies ein falsches Positiv zurückgeben würde. Ansonsten viel Spaß!
quelle
REGEXP
überprüft wird. Daher ist garantiert, dass es immer übereinstimmt. Auch^$
ist wahrscheinlich nicht das, was Sie wollten.Versuchen Sie, diese Abfrage zum Durchsuchen von Sonderzeichendatensätzen zu verwenden
quelle
Die Antwort von @ zende war die einzige, die Spalten mit einer Mischung aus ASCII- und Nicht-ASCII-Zeichen abdeckte, aber sie hatte auch diese problematische Hex-Sache. Ich habe das benutzt:
quelle
In Oracle können wir unten verwenden.
quelle
Für diese Frage können wir auch diese Methode verwenden:
Frage vom sql zoo: Hier
finden Sie alle Details zu dem von PETER GRÜNBERG gewonnenen Preis
Nicht-ASCII-Zeichen
ans: wähle * aus nobel wo Gewinner wie 'P% GR% _% berg';
quelle