如何在MySQL中找到非ASCII字符?

时间:2008-12-30 22:54:57

标签: mysql character-encoding

我正在使用MySQL数据库,该数据库包含从Excel导入的一些数据。数据包含非ASCII字符(em破折号等)以及隐藏的回车符或换行符。有没有办法使用MySQL找到这些记录?

10 个答案:

答案 0 :(得分:192)

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)

答案 1 :(得分:91)

您可以将ASCII定义为十进制值为0 - 127(0x00 - 0x7F)的所有字符,并使用以下查询查找包含非ASCII字符的列

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

这是我能提出的最全面的查询。

答案 2 :(得分:54)

这完全取决于您所定义的“ASCII”,但我建议尝试这样的查询变体:

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

该查询将返回columnToCheck包含任何非字母数字字符的所有行。如果您有其他可接受的字符,请将它们添加到正则表达式中的字符类。例如,如果句点,逗号和连字符都正常,请将查询更改为:

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

MySQL文档中最相关的页面可能是 12.5.2 Regular Expressions

答案 3 :(得分:41)

这可能就是你要找的东西:

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

它应返回COLUMN包含非ASCII字符的所有行(或不可打印的ASCII字符,如换行符)。

答案 4 :(得分:13)

上面每个人的例子中缺少的一个字符是终止字符(\ 0)。这对于MySQL控制台输出是不可见的,并且不能被迄今提到的任何查询发现。查找它的查询很简单:

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

答案 5 :(得分:2)

基于正确答案,但考虑到ASCII控制字符,对我有用的解决方案是:

SELECT * FROM `table` WHERE NOT `field` REGEXP  "[\\x00-\\xFF]|^$";

它做同样的事情:在列中搜索违反ASCII范围的行为,但也允许您搜索控制字符,因为它对代码点使用十六进制表示法。由于没有比较或转换(不像@ Ollie的答案),这也应该明显更快。 (特别是如果MySQL在正则表达式查询上提前终止,它肯定应该。)

它还可以避免返回零长度的字段。如果您想要一个可能性能更好的稍长版本,您可以改用它:

SELECT * FROM `table` WHERE `field` <> "" AND NOT `field` REGEXP  "[\\x00-\\xFF]";

它会对长度进行单独检查以避免零长度结果,而不考虑它们的正则表达式。根据您拥有的零长度条目的数量,这可能会明显加快。

请注意,如果您的默认字符集是奇怪的,其中0x00-0xFF不映射到与ASCII相同的值(是否存在这样的字符集?),这将返回误报。否则,享受!

答案 6 :(得分:0)

尝试使用此查询搜索特殊字符记录

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

答案 7 :(得分:0)

@ zende的答案是唯一一个涵盖ascii和非ascii字符组合的列,但它也有那个有问题的hex事件。我用过这个:

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

答案 8 :(得分:0)

在Oracle中,我们可以在下面使用。

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

答案 9 :(得分:-2)

对于这个问题,我们也可以使用这种方法:

来自sql zoo的问题:
查找PETERGRÜNBERG赢得的奖项的所有详细信息

非ASCII字符

ans:从诺贝尔选择*,其中赢家喜欢'P%GR%_%berg';