3

MySQL で非 ASCII 文字を見つけるにはどうすればよいですか?への関連質問 .

キーボード以外の文字が存在する場合について、以下の表で col1 と col2 を確認したいと思います。

+------------+----------+
|    col1    |    col2  |
+------------+----------+
| rewweew\s  |  4rtrt   |
| é          |  é       |
| 123/       |  h|h     |
| ëû         |  û       |
| ¼          |  ¼       |
| *&^        |  *%$     |
| #$         |  ~!`     |
+------------+----------+

私の望ましい結果は次のようになります

 +--------+-------+
 |   é    |   é   |
 |   ëû   |   û   |
 |   ¼    |   ¼   |
 +--------+-------+

私の場合、英語キーボードに存在するすべての文字が許可されているため、漢字などの英語キーボードに存在しない文字を含む行のみを見つける必要があります.

リンクから以下のクエリを取得しました MySQL で非 ASCII 文字を見つけるにはどうすればよいですか?

SELECT * FROM tableName WHERE NOT columnToCheck REGEXP '[A-Za-z0-9.,-]';

しかし、文字 ~`@!#$%^&*()_-+=|}]{[':;?/>.<, も許可されていますが、それらを無視しているため、機能しません。

4

2 に答える 2

11

これは試してみる価値があるかもしれません。

SELECT whatever
  FROM tableName 
 WHERE columnToCheck <> CONVERT(columnToCheck USING ASCII)

このCONVERT(col USING charset)関数は、変換できない文字を置換文字に変換します。その場合、変換されたテキストと変換されていないテキストは等しくなりません。

もちろん、特定のキーボードにあるものではなく、ASCII文字レパートリーにあるものとないものに基づいています。しかし、それはおそらくあなたのためにトリックをするはずです。詳細については、これを参照してください。 http://dev.mysql.com/doc/refman/5.0/en/charset-repertoire.html

の代わりに、任意の文字セット名を使用できますASCII。たとえば、コードページ1257(リトアニア語、ラトビア語、エストニア語)でどの文字が正しくレンダリングされないかを知りたい場合は、CONVERT(columnToCheck USING cp1257)

編集 あなたのコメントは、ASCII文字セットにあるいくつかの文字も検出する必要があると述べました。0x00から0x1f、次に0x7fの値を持ついわゆる制御文字について質問していると思います@Joni Salonenのアプローチは私たちをそこに導くのに役立ちますが、マルチバイト文字で安全な方法でそれを行う必要があります。

 SELECT whatever
   FROM tableName
  WHERE CONVERT(columnToCheck USING ASCII) <> columnToCheck
     OR CONVERT(columnToCheck USING ASCII) RLIKE '[[.NUL.]-[.US.][.DEL.]]'

http://www.asciitable.com/を見ると、ここのOR句がASCIIテーブルの最初の列の文字と4番目の列の最後の文字を検出していることがわかります。

于 2012-07-31T12:49:16.580 に答える
3

このクエリは、ASCII 範囲 0 ~ 127 以外の文字を含む行を返します。

SELECT * FROM tableName WHERE NOT columnToCheck REGEXP '^[[.NUL.]-[.DEL.]]*$'

英語キーボードとは、アメリカまたはイギリスのキーボードを意味しますか? UK キーボードには、スターリング ポンド記号などの非 ASCII 文字が含まれています。それらも受け入れたい場合は、それらを正規表現に追加する必要があります。

于 2012-07-31T12:56:02.740 に答える