我正在使用MySQL数据库,该数据库包含从Excel导入的一些数据.数据包含非ASCII字符(em破折号等)以及隐藏的回车符或换行符.有没有办法使用MySQL查找这些记录?
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)
您可以将ASCII定义为十进制值为0 - 127(0x00 - 0x7F)的所有字符,并使用以下查询查找具有非ASCII字符的列
SELECT * FROM TABLE WHERE NOT HEX(COLUMN) REGEXP '^([0-7][0-9A-F])*$';
这是我能提出的最全面的查询.
它完全取决于您所定义的"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正则表达式.
这可能是你正在寻找的:
select * from TABLE where COLUMN regexp '[^ -~]';
它应返回COLUMN包含非ASCII字符的所有行(或不可打印的ASCII字符,如换行符).
上面每个人的例子中缺少一个字符是终止字符(\ 0).这对于MySQL控制台输出是不可见的,并且不能被迄今提到的任何查询发现.查找它的查询很简单:
select * from TABLE where COLUMN like '%\0%';