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

Ank*_*rma 3 mysql matching

相关问题如何在MySQL中找到非ASCII字符?.

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

+------------+----------+
|    col1    |    col2  |
+------------+----------+
| rewweew\s  |  4rtrt   |
| é          |  é       |
| 123/       |  h|h     |
| ëû         |  û       |
| ¼          |  ¼       |
| *&^        |  *%$     |
| #$         |  ~!`     |
+------------+----------+
Run Code Online (Sandbox Code Playgroud)

我想要的结果看起来像

 +--------+-------+
 |   é    |   é   |
 |   ëû   |   û   |
 |   ¼    |   ¼   |
 +--------+-------+
Run Code Online (Sandbox Code Playgroud)

在我的情况下,允许使用英文键盘中的所有字符,我只需要查找具有英文键盘中不存在的字符的行,如汉字等.

我从链接中获得了下面提到的查询如何在MySQL中找到非ASCII字符?

SELECT * FROM tableName WHERE NOT columnToCheck REGEXP '[A-Za-z0-9.,-]';
Run Code Online (Sandbox Code Playgroud)

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

O. *_*nes 10

这可能值得一试.

SELECT whatever
  FROM tableName 
 WHERE columnToCheck <> CONVERT(columnToCheck USING ASCII)
Run Code Online (Sandbox Code Playgroud)

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.]]'
Run Code Online (Sandbox Code Playgroud)

如果你看一下http://www.asciitable.com/,你会发现这里的OR子句检测到ASCII表第一列中的字符,以及第四列中的最后一个字符.