我正在使用从Excel导入一些数据的MySQL数据库。该数据包含非ASCII字符(如破折号等)以及隐藏的回车符或换行符。有没有办法使用MySQL来查找这些记录?如何在MySQL中查找非ASCII字符?
回答
这取决于正是你定义为“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。
谢谢 - 我会看看那个。我在SQL中使用正则表达式没有太多经验,所以这将是一个很好的学习机会。 – 2008-12-31 03:47:36
难道你不应该跳过连字符和句点吗? (因为它们在正则表达式中具有特殊含义。) SELECT * FROM tableName WHERE NOT columnToCheck REGEXP'[A-Za-z0-9 \。,\ - ]'; – Tooony 2009-03-12 16:03:54
“NOT”应该在“REGEXP”前面。这只适用于当“不”在那个地方时。 – 2010-04-15 17:20:43
这可能是你在找什么:
select * from TABLE where COLUMN regexp '[^ -~]';
它应该返回,其中列包含所有行非ASCII字符(或不可打印的ASCII字符,如新行)。
您可以定义ASCII作为有0的十进制值的所有字符 - 127(0×00 - 0x7F的),并使用下面的查询
SELECT * FROM TABLE WHERE NOT HEX(COLUMN) REGEXP '^([0-7][0-9A-F])*$';
找到非ASCII字符列这是最全面查询我可以想出来。
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)
上面每个人的示例中缺少的一个字符是终止字符(\ 0)。这对MySQL控制台输出是不可见的,并且不会被前面提到的任何查询发现。找到它的查询很简单:
select * from TABLE where COLUMN like '%\0%';
基于正确的答案,但考虑到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相同的值(是否存在这样的字符集在任何地方?),这将返回一个误报。否则,享受!
尝试使用此查询搜索的特殊字符记录
SELECT *
FROM tableName
WHERE fieldName REGEXP '[^[email protected]:. \'\-`,\&]'
@怎地的回答是,覆盖柱与ASCII和非ASCII字符的组合只有一个,但它也有这样的问题的十六进制的事情。我用这个:
SELECT * FROM `table` WHERE NOT `column` REGEXP '^[ -~]+$' AND `column` !=''
- 1. mySql - 在html中查找非Ascii字符
- 2. 查找非ASCII字符的字符串
- 3. 如何在字符串中查找非ASCII符号。 DB2
- 4. DB2 SQL查询来查找字符串中的非ASCII字符
- 5. Unix命令查找非ASCII字符
- 6. 在字符串中查找ascii号码
- 7. C++ 11 - Unicode字符串 - 查找是否包含非ASCII字符
- 8. 在mysql表中找到非ascii空间
- 9. 如何在mysql中查找Unicode字符?
- 10. 如何使用正则表达式在文件中查找非ascii字符Python
- 11. 如何查找字符串中字符的ascii值?
- 12. 检查matlab中的非ascii字符
- 13. 如何从字符串中去除非ASCII字符?在C++中
- 14. 查找ASCII字符范围
- 15. 文字中的非ASCII,非Unicode字符
- 16. 非ASCII字符停止mysql语句
- 17. 在列中查找非ascii值的行
- 18. FWRITE非ASCII字符
- 19. wxStyledTextCtrl非ASCII字符
- 20. ActionMailer非ASCII字符
- 21. Python非ASCII字符
- 22. fputcsv中的非ascii字符
- 23. Matplotlib中的非ASCII字符
- 24. PHP中的非ASCII字符?
- 25. C中的非ASCII字符
- 26. 如何在wtx中查找字符的ASCII值
- 27. Bash/Linux在.txt文件中查找非ASCII字符并将其替换为ASCII字符
- 28. 如何让email.Header.decode_header使用非ASCII字符?
- 29. 如何打印非ASCII字符用C
- 30. Postgresql约束检查非ASCII字符
Ollie Jones有一个更好的答案(检查底部)。 – 2012-11-12 17:45:27
@JonathanArkell不在底部:) – Brilliand 2014-05-22 22:02:22
更正..检查中间! ;) – 2014-05-23 15:26:44