web-dev-qa-db-ja.com

MySQLで非ASCII文字を見つけるにはどうすればよいですか?

Excel からインポートされたデータを持つMySQLデータベースを使用しています。データには、非- [〜#〜] ascii [〜#〜] 文字(ダッシュなど)と非表示のキャリッジリターンまたはラインフィードが含まれます。 MySQLを使用してこれらのレコードを見つける方法はありますか?

111
Ed Mays

「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正規表現です。

56
Chad Birch

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)を使用します

195
O. Jones

ASCII 10進値が0-127(0x00-0x7F)のすべての文字として定義し、次のクエリを使用して非ASCII文字の列を検索できます。

SELECT * FROM TABLE WHERE NOT HEX(COLUMN) REGEXP '^([0-7][0-9A-F])*$';

これは、私が思いつく最も包括的なクエリでした。

91
zende

これはおそらくあなたが探しているものです:

select * from TABLE where COLUMN regexp '[^ -~]';

COLUMNにASCII以外の文字(または印刷できないASCII改行などの文字)が含まれるすべての行を返す必要があります。

41
David Minor

上記の全員の例から欠落している1つの文字は、終了文字(\ 0)です。これは、MySQLコンソールの出力からは見えず、前述のクエリのいずれでも検出できません。それを見つけるためのクエリは単純です:

select * from TABLE where COLUMN like '%\0%';
13
Rob Bailey

正解に基づいていますが、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(そのような文字セットはどこかに存在しますか?)と同じ値にマッピングされない奇妙なものである場合、これは誤検知を返します。それ以外の場合は、enjoy!

2

このクエリを使用して特殊文字レコードを検索してみてください

SELECT *
FROM tableName
WHERE fieldName REGEXP '[^a-zA-Z0-9@:. \'\-`,\&]'
1
Sachin

Oracleでは、以下を使用できます。

SELECT * FROM TABLE_A WHERE ASCIISTR(COLUMN_A) <> COLUMN_A;
0

@zendeの答えは、アスキー文字と非アスキー文字が混在する列をカバーする唯一のものでしたが、その問題のある16進数の問題もありました。私はこれを使用しました:

SELECT * FROM `table` WHERE NOT `column` REGEXP '^[ -~]+$' AND `column` !=''
0
chiliNUT