Excelからインポートされたデータが含まれているMySQLデータベースを使用しています。データには、非ASCII文字(ダッシュなど)と、非表示の改行または改行が含まれます。MySQLを使用してこれらのレコードを見つける方法はありますか?
Excelからインポートされたデータが含まれているMySQLデータベースを使用しています。データには、非ASCII文字(ダッシュなど)と、非表示の改行または改行が含まれます。MySQLを使用してこれらのレコードを見つける方法はありますか?
回答:
「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 tbl WHERE colname NOT REGEXP '^[A-Za-z0-9\.,@&\(\) \-]*$';
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)
次のクエリを使用して、ASCIIを10進数の値が0-127(0x00-0x7F)のすべての文字として定義し、非ASCII文字の列を検索できます。
SELECT * FROM TABLE WHERE NOT HEX(COLUMN) REGEXP '^([0-7][0-9A-F])*$';
これは私が思いつくことができる最も包括的なクエリでした。
SELECT * FROM table WHERE LENGTH( column ) != CHAR_LENGTH( column )
'ā'
(バイト配列によってコードを0x0101
) -それはみなされるであろう「ASCII」は、この試験を使用して:偽陰性を、実際、一部の文字セットはASCII文字をにエンコードしない0x00
ため0x7f
、このソリューションでは誤検知が発生します。 この答えに依存しないでください!
LENGTH(column)
にCHAR_LENGTH(column)
関係なく定数の倍数になります。
これはおそらくあなたが探しているものです:
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と同じ値にマッピングされていない場合(そのような文字セットはどこかに存在しますか?)、これは誤検知を返します。それ以外の場合は、お楽しみください!
REGEXP
がチェック対象です。したがって、常に一致することが保証されています。また^$
、おそらくあなたが望んでいたものではありません。
Oracleでは、以下を使用できます。
SELECT * FROM TABLE_A WHERE ASCIISTR(COLUMN_A) <> COLUMN_A;