如何在MySQL中找到非键盘字符?

时间:2012-07-31 12:00:43

标签: mysql matching

How can I find non-ASCII characters in MySQL?的相关问题。

我想在下面给出的表格中检查col1和col2,以了解非键盘字符存在的情况。

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

我想要的结果看起来像

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

在我的情况下,英语键盘中的所有字符都是允许的,我只需找出英文键盘中没有字符的行,如汉字等。

我从链接How can I find non-ASCII characters in MySQL?

获得了以下提到的查询
SELECT * FROM tableName WHERE NOT columnToCheck REGEXP '[A-Za-z0-9.,-]';

但它不起作用,因为字符~` @!#$%^& *()_- + = |}] {[':;?/>。&lt ;,也是允许但忽略了它们。

2 个答案:

答案 0 :(得分:10)

这可能值得一试。

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

答案 1 :(得分:3)

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

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

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