Excelからデータをインポートした MySQL データベースを使用しています。データには非ASCII文字 (em ダッシュなど) と非表示のキャリッジ リターンまたはライン フィードが含まれています。MySQL を使用してこれらのレコードを見つける方法はありますか?
10 に答える
MySQLは、この種の問題に役立つ包括的な文字セット管理を提供します。
SELECT whatever
FROM tableName
WHERE columnToCheck <> CONVERT(columnToCheck USING ASCII)
このCONVERT(col USING charset)
関数は、変換できない文字を置換文字に変換します。その場合、変換されたテキストと変換されていないテキストは等しくなりません。
詳細については、これを参照してください。https://dev.mysql.com/doc/refman/8.0/en/charset-repertoire.html
ASCIIの代わりに、任意の文字セット名を使用できます。たとえば、コードページ1257(リトアニア語、ラトビア語、エストニア語)でどの文字が正しくレンダリングされないかを知りたい場合は、CONVERT(columnToCheck USING cp1257)
次のクエリを使用して、10 進値が 0 から 127 (0x00 から 0x7F) のすべての文字として ASCII を定義し、非 ASCII 文字を含む列を検索できます。
SELECT * FROM TABLE WHERE NOT HEX(COLUMN) REGEXP '^([0-7][0-9A-F])*$';
これは、私が思いついた最も包括的なクエリでした。
「ASCII」として何を定義しているかによって異なりますが、次のようなクエリの変形を試すことをお勧めします。
SELECT * FROM tableName WHERE columnToCheck NOT REGEXP '[A-Za-z0-9]';
そのクエリは、columnToCheck に英数字以外の文字が含まれているすべての行を返します。受け入れ可能な他の文字がある場合は、それらを正規表現の文字クラスに追加します。たとえば、ピリオド、カンマ、およびハイフンが問題ない場合は、クエリを次のように変更します。
SELECT * FROM tableName WHERE columnToCheck NOT REGEXP '[A-Za-z0-9.,-]';
MySQL ドキュメントの最も関連性の高いページは、おそらく12.5.2 正規表現です。
これはおそらくあなたが探しているものです:
select * from TABLE where COLUMN regexp '[^ -~]';
COLUMN に非 ASCII 文字 (または改行などの印刷不可能な ASCII 文字) が含まれるすべての行を返す必要があります。
正しい答えに基づいていますが、ASCII制御文字も考慮して、私にとってうまくいった解決策は次のとおりです。
SELECT * FROM `table` WHERE NOT `field` REGEXP "[\\x00-\\xFF]|^$";
同じことを行います。列内の ASCII 範囲の違反を検索しますが、コード ポイントに 16 進表記を使用するため、制御文字も検索できます。(@ Ollieの回答とは異なり)比較や変換がないため、これも大幅に高速になるはずです。(特に、MySQL が正規表現クエリで早期終了を行う場合、これは間違いなくそうすべきです。)
また、長さゼロのフィールドを返すことも回避します。パフォーマンスが向上する可能性のある少し長いバージョンが必要な場合は、代わりにこれを使用できます。
SELECT * FROM `table` WHERE `field` <> "" AND NOT `field` REGEXP "[\\x00-\\xFF]";
長さゼロの結果を避けるために、正規表現パスを考慮せずに、長さの個別のチェックを行います。長さがゼロのエントリの数によっては、これが大幅に高速になる可能性があります。
デフォルトの文字セットが奇妙で、0x00-0xFF が ASCII と同じ値にマップされない場合 (そのような文字セットはどこかに存在しますか?)、これは誤検知を返すことに注意してください。そうでなければ、楽しんでください!
このクエリを使用して特殊文字レコードを検索してみてください
SELECT *
FROM tableName
WHERE fieldName REGEXP '[^a-zA-Z0-9@:. \'\-`,\&]'