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 表的第一列中的字符,以及第四列中的最后一个字符。

于 2012-07-31T12:49:16.580 回答
3

此查询将返回字符超出 ASCII 范围 0 - 127 的行:

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

英文键盘是指美式键盘还是英式键盘?英国键盘包含一些非 ASCII 字符,例如英镑符号。如果您也想接受这些,则必须将它们添加到正则表达式中。

于 2012-07-31T12:56:02.740 回答