2008-12-30 30 views
90

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

+7

Ollie Jones有一个更好的答案(检查底部)。 – 2012-11-12 17:45:27

+0

@JonathanArkell不在底部:) – Brilliand 2014-05-22 22:02:22

+0

更正..检查中间! ;) – 2014-05-23 15:26:44

回答

48

这取决于正是你定义为“ASCII”是什么,但我会建议您尝试使用查询这样的变体:

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

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

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

MySQL文档的最相关的网页大概是12.5.2 Regular Expressions

+0

谢谢 - 我会看看那个。我在SQL中使用正则表达式没有太多经验,所以这将是一个很好的学习机会。 – 2008-12-31 03:47:36

+3

难道你不应该跳过连字符和句点吗? (因为它们在正则表达式中具有特殊含义。) SELECT * FROM tableName WHERE NOT columnToCheck REGEXP'[A-Za-z0-9 \。,\ - ]'; – Tooony 2009-03-12 16:03:54

+2

“NOT”应该在“REGEXP”前面。这只适用于当“不”在那个地方时。 – 2010-04-15 17:20:43

41

这可能是你在找什么:

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

它应该返回,其中列包含所有行非ASCII字符(或不可打印的ASCII字符,如新行)。

91

您可以定义ASCII作为有0的十进制值的所有字符 - 127(0×00 - 0x7F的),并使用下面的查询

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

找到非ASCII字符列这是最全面查询我可以想出来。

150

MySQL提供了全面的字符集管理,可以帮助解决这类问题。

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

CONVERT(col USING charset)函数会将不可转换字符转换为替换字符。然后,转换和未转换的文本将不相等。

查看更多讨论。 http://dev.mysql.com/doc/refman/5.7/en/charset-repertoire.html

您可以使用任何字符集名称代替ASCII。例如,如果要查找代码页1257(立陶宛语,拉脱维亚语,爱沙尼亚语)中无法正确呈现哪些字符,请使用CONVERT(columnToCheck USING cp1257)

11

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

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

基于正确的答案,但考虑到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相同的值(是否存在这样的字符集在任何地方?),这将返回一个误报。否则,享受!

0

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

SELECT * 
FROM tableName 
WHERE fieldName REGEXP '[^[email protected]:. \'\-`,\&]' 
0

@怎地的回答是,覆盖柱与ASCII和非ASCII字符的组合只有一个,但它也有这样的问题的十六进制的事情。我用这个:

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