我如何在MySQL中find非ASCII字符?
我正在使用从Excel导入一些数据的MySQL数据库。 数据包含非ASCII字符(如破折号等)以及隐藏的回车符或换行符。 有没有办法使用MySQL来查找这些logging?
这取决于你正在定义为“ASCII”,但我会build议尝试像这样的查询的变体:
SELECT * FROM tableName WHERE NOT columnToCheck REGEXP '[A-Za-z0-9]';
该查询将返回columnToCheck包含任何非字母数字字符的所有行。 如果您有其他可接受的字符,请将其添加到正则expression式中的字符类中。 例如,如果句点,逗号和连字符正确,请将查询更改为:
SELECT * FROM tableName WHERE NOT columnToCheck REGEXP '[A-Za-z0-9.,-]';
MySQL文档中最相关的页面可能是12.5.2正则expression式 。
MySQL提供了全面的字符集pipe理,可以帮助解决这类问题。
SELECT whatever FROM tableName WHERE columnToCheck <> CONVERT(columnToCheck USING ASCII)
CONVERT(col USING charset)
函数将把不可转换的字符转换成replace字符。 然后,转换和未转换的文本将不平等。
看到这个更多的讨论。 http://dev.mysql.com/doc/refman/5.7/en/charset-repertoire.html
您可以使用任何字符集名称代替ASCII。 例如,如果要查找代码页1257(立陶宛,拉脱维亚,爱沙尼亚语)中哪些字符将不能正确呈现,请使用CONVERT(columnToCheck USING cp1257)
您可以将ASCII定义为所有具有十进制值为0 – 127(0x00 – 0x7F)的字符,并使用以下查询来查找包含非ASCII字符的列
SELECT * FROM TABLE WHERE NOT HEX(COLUMN) REGEXP '^([0-7][0-9A-F])*$';
这是我可以提出的最全面的查询。
这可能是你要找的东西:
select * from TABLE where COLUMN regexp '[^ -~]';
它应该返回COLUMN包含非ASCII字符(或不可打印的ASCII字符,如换行符)的所有行。
从上面每个人的例子中缺less的一个字符是终止字符(\ 0)。 这对于MySQL控制台输出来说是不可见的,并且不会被前面提到的任何查询发现。 查询它是简单的:
select * from TABLE where COLUMN like '%\0%';
基于正确的答案,但同时考虑到ASCII控制字符,为我工作的解决scheme是这样的:
SELECT * FROM `table` WHERE NOT `field` REGEXP "[\\x00-\\xFF]|^$";
它也做同样的事情:在列中search违反ASCII范围的内容,但是也可以search控制字符,因为它使用hex符号来表示代码点。 由于没有比较或转换(不像@ Ollie的答案),这也应该快得多。 (尤其是如果MySQL在正则expression式查询中提前终止的话,那肯定是应该的。)
它也避免了返回零长度的字段。 如果你想要一个稍微更长的版本,可能会更好,你可以使用它来代替:
SELECT * FROM `table` WHERE `field` <> "" AND NOT `field` REGEXP "[\\x00-\\xFF]";
它会对长度进行单独的检查,以避免零长度的结果,而不考虑它们的正则expression式。 根据您拥有的零长度条目的数量,这可能会更快。
请注意,如果您的默认字符集是奇怪的,0x00-0xFF不映射到与ASCII相同的值(是否存在这样的字符集在任何地方?),这将返回一个误报。 否则,享受!
尝试使用此查询来search特殊字符logging
SELECT * FROM tableName WHERE fieldName REGEXP '[^a-zA-Z0-9@:. \'\-`,\&]'