Answers:
这完全取决于您定义为“ 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 tbl WHERE colname NOT REGEXP '^[A-Za-z0-9\.,@&\(\) \-]*$';
MySQL提供了全面的字符集管理,可以帮助解决此类问题。
SELECT whatever
FROM tableName
WHERE columnToCheck <> CONVERT(columnToCheck USING ASCII)
该CONVERT(col USING charset)
功能将不可转换的字符转换为替换字符。这样,转换后的文本和未转换的文本将不相等。
看到这个更多的讨论。https://dev.mysql.com/doc/refman/8.0/zh-CN/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 LENGTH( column ) != CHAR_LENGTH( column )
'ā'
(由字节序列编码0x0101
)-在此测试中将其视为“ ASCII”:假阴性;实际上,某些字符集未在其中编码ASCII字符0x00
,0x7f
因此此解决方案将产生误报。 不要仅仅依靠这个答案!
LENGTH(column)
它都是常数倍CHAR_LENGTH(column)
。
这可能是您要寻找的:
select * from TABLE where COLUMN regexp '[^ -~]';
它应返回COLUMN包含非ASCII字符(或不可打印的ASCII字符,例如换行符)的所有行。
REGEXP
和RLIKE
。运营商在逐字节的方式工作,所以它们不是多字节安全和可能产生的多字节字符集意想不到的效果另外,这些运营商通过它们的字节值进行比较的字符和即使给定的归类将带重音符号的字符视为相等,也是如此。 “
基于正确的答案,但还要考虑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相同的值(在任何地方都存在这样的字符集吗?),这将返回假肯定。否则,请尽情享受!
REGEXP
。因此,保证总是匹配。也^$
可能不是您想要的。
在Oracle中,我们可以在下面使用。
SELECT * FROM TABLE_A WHERE ASCIISTR(COLUMN_A) <> COLUMN_A;
对于这个问题,我们也可以使用以下方法:
sql zoo的问题:
查找由PETERGRÜNBERG赢得的奖金的所有详细信息
非ASCII字符
回答:从诺贝尔奖获得者*“ P%GR%_%berg”等获胜者;