Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MySQL中找到非ASCII字符?_Mysql_Character Encoding - Fatal编程技术网

如何在MySQL中找到非ASCII字符?

如何在MySQL中找到非ASCII字符?,mysql,character-encoding,Mysql,Character Encoding,我正在使用一个MySQL数据库,该数据库从中导入了一些数据。数据包含非字符(em破折号等)以及隐藏的回车符或换行符。有没有使用MySQL查找这些记录的方法?这完全取决于您定义的“ASCII”,但我建议尝试以下查询的变体: SELECT * FROM tableName WHERE columnToCheck NOT REGEXP '[A-Za-z0-9]'; 该查询将返回columnToCheck包含任何非字母数字字符的所有行。如果有其他可以接受的字符,请将它们添加到正则表达式中的字符类中。例

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

这完全取决于您定义的“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文档中最相关的页面可能是。

这可能就是您要查找的内容:

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

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

您可以将ASCII定义为十进制值为0-127(0x00-0x7F)的所有字符,并使用以下查询查找包含非ASCII字符的列

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

这是我能想到的最全面的查询。

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

SELECT whatever
  FROM tableName 
 WHERE columnToCheck <> CONVERT(columnToCheck USING ASCII)
选择任何内容
从表名
其中columnToCheck转换(columnToCheck使用ASCII)
CONVERT(使用字符集的列)
函数将无法转换的字符转换为替换字符。然后,转换的文本和未转换的文本将不相等

更多讨论请参见此


您可以使用任何字符集名称来代替ASCII。例如,如果您想找出哪些字符在代码页1257(立陶宛语、拉脱维亚语、爱沙尼亚语)中无法正确呈现,请使用
CONVERT(columnToCheck使用cp1257)
上述示例中缺少的一个字符是终止字符(\0)。这对于MySQL控制台输出是不可见的,并且在前面提到的任何查询中都无法发现。查找它的查询很简单:

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

根据正确答案,但同时考虑ASCII控制字符,对我有效的解决方案是:

SELECT * FROM `table` WHERE NOT `field` REGEXP  "[\\x00-\\xFF]|^$";
它也做同样的事情:在一列中搜索违反ASCII范围的内容,但也允许您搜索控制字符,因为它使用十六进制符号表示代码点。由于没有比较或转换(与@Ollie的答案不同),这也应该大大加快。(特别是如果MySQL在regex查询上提前终止,它肯定应该这样做。)

它还避免返回长度为零的字段。如果您想要一个稍微长一点、性能更好的版本,您可以使用此版本:

SELECT * FROM `table` WHERE `field` <> "" AND NOT `field` REGEXP  "[\\x00-\\xFF]";
从`table`中选择*而不是`field`REGEXP'[\\x00-\\xFF]”;
它对长度进行单独检查,以避免零长度结果,而不考虑正则表达式过程中的结果。根据您拥有的零长度条目的数量,这可能会显著加快


请注意,如果您的默认字符集很奇怪,其中0x00-0xFF没有映射到与ASCII相同的值(是否存在这样的字符集?),这将返回假阳性。否则,享受吧

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

SELECT *
FROM tableName
WHERE fieldName REGEXP '[^a-zA-Z0-9@:. \'\-`,\&]'

@zende的答案是唯一一个包含ascii和非ascii字符混合的列,但它也有那个有问题的十六进制。我用了这个:

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

对于这个问题,我们也可以使用以下方法:

来自sql zoo的问题:
查找PETER GRÜNBERG获奖的所有详细信息

非ASCII字符


回答:从诺贝尔奖获得者中选择*,如“p%GR%u%berg”

在Oracle中,我们可以使用以下内容

SELECT * FROM TABLE_A WHERE ASCIISTR(COLUMN_A) <> COLUMN_A;
从表A中选择*,其中ASCIISTR(列A)列A;

您不应该跳过连字符和句点吗?(因为它们在正则表达式中有特殊的含义。)从tableName中选择*而不是columnToCheck REGEXP'[a-Za-z0-9\,\-]@不,在一个集合中,句号只表示它自己,破折号只在其他字符之间有特殊的含义。在集合的末尾,它只表示它自己。此查询只查找tableName中不包含字母数字字符的所有行。这并不能回答问题。这是针对根本没有任何ascii字符的列,因此它将错过那些混合使用ascii和非ascii字符的列。下面来自zende的答案检查一个或多个非ascii字符。这在很大程度上帮助了我
从tbl中选择*,其中colname不是REGEXP'^[A-Za-z0-9\,@&\(\)\-]*$这只适用于(无论如何对我来说)查找不包含这些字符的字符串。它找不到包含ASCII和非ASCII字符混合的字符串。这是解决此问题的一个很好的解决方案,而且更加健壮。这对于查找带有重音符号(áä等)的字符或不属于编码的字符也很有用,比使用REGEXP要好得多(这似乎对我来说不适合查找重音符号)而且还提供了一种简单的机制,使所有内容都再次成为ascii码……这个答案工作得非常好,将显示包含任何非ascii字符的字符串,而不仅仅是只包含非ascii字符的字符串。非常感谢。杰出的解决方案!奥利·琼斯有一个更好的答案(检查底部)。@JonathanArkell不再在底部:)更正。。检查中间!;)这是@Jonathan目前谈论的最佳答案,但更简单的是:
SELECT*FROM table WHERE LENGTH(column)!=字符长度(列)
-1这可能会产生错误的结果。例如,假设有一个UTF-16列包含
“ā”
(由字节序列编码
0x0101
)-使用此测试将被视为“ASCII”:假阴性;事实上,有些字符集不将
0x00
0x7f
whereupo中的ASCII字符编码