MySQLで非ASCII文字を見つけるにはどうすればよいですか?
-
03-07-2019 - |
解決
" ASCII"として定義しているものによって異なりますが、次のようなクエリのバリアントを試すことをお勧めします。
SELECT * FROM tableName WHERE columnToCheck NOT REGEXP '[A-Za-z0-9]';
このクエリは、columnToCheckに英数字以外の文字が含まれるすべての行を返します。受け入れ可能な他の文字がある場合は、正規表現の文字クラスに追加します。たとえば、ピリオド、コンマ、ハイフンがOKの場合、クエリを次のように変更します。
SELECT * FROM tableName WHERE columnToCheck NOT REGEXP '[A-Za-z0-9.,-]';
MySQLドキュメントの最も関連性の高いページは、おそらく です。 12.5.2正規表現 。
他のヒント
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を0〜127(0x00-0x7F)の10進値を持つすべての文字として定義し、次のクエリを使用して非ASCII文字の列を見つけることができます
SELECT * FROM TABLE WHERE NOT HEX(COLUMN) REGEXP '^([0-7][0-9A-F])*
これは、私が思いつく最も包括的なクエリでした。
;
これは、私が思いつく最も包括的なクエリでした。
これはおそらくあなたが探しているものです:
select * from TABLE where COLUMN regexp '[^ -~]';
COLUMNに非ASCII文字(または改行などの印刷不可能なASCII文字)が含まれるすべての行を返す必要があります。
上記のすべての例で不足している1つの文字は、終了文字(\ 0)です。これは、MySQLコンソールの出力からは見えず、前述のクエリのいずれでも検出できません。それを見つけるためのクエリは単純です:
select * from TABLE where COLUMN like '%\0%';
正解に基づいていますが、ASCII制御文字も考慮に入れて、私のために働いた解決策はこれです:
SELECT * FROM `table` WHERE NOT `field` REGEXP "[\\x00-\\xFF]|^SELECT * FROM `table` WHERE `field` <> "" AND NOT `field` REGEXP "[\\x00-\\xFF]";
quot;;
同じことを行います:列内のASCII範囲の違反を検索しますが、コードポイントに16進表記を使用するため、制御文字も検索できます。 (@Ollieの答えとは異なり)比較や変換は行われないため、これも非常に高速です。 (特に、MySQLが正規表現クエリで早期終了する場合、これは間違いなく必要です。)
また、長さがゼロのフィールドを返すことも避けます。パフォーマンスが向上する可能性がある少し長いバージョンが必要な場合は、代わりにこれを使用できます:
<*>正規表現のパスを考慮せずに、長さ0の結果を回避するために、長さの個別のチェックを行います。長さゼロのエントリの数に応じて、これは非常に高速になる可能性があります。
デフォルトの文字セットが0x00-0xFFがASCIIと同じ値にマップされない奇妙なものである場合(そのような文字セットはどこかに存在しますか?)、これは誤検知を返します。それ以外の場合は、お楽しみください!
このクエリを使用して特殊文字レコードを検索してみてください
SELECT *
FROM tableName
WHERE fieldName REGEXP '[^a-zA-Z0-9@:. \'\-`,\&]'
@zendeの答えは、アスキー文字と非アスキー文字が混在する列をカバーした唯一のものでしたが、問題のある16進数の問題もありました。これを使用しました:
SELECT * FROM `table` WHERE NOT `column` REGEXP '^[ -~]+ AND `column` !=''
Oracleでは、以下を使用できます。
SELECT * FROM TABLE_A WHERE ASCIISTR(COLUMN_A) <> COLUMN_A;
この質問には、このメソッドも使用できます:
sql zooからの質問:
PETER GR&#220; NBERGが受賞した賞品の詳細をすべて見つける
非ASCII文字
ans:select * from nobel where 'winner like' P%GR%_%berg ';