共计 1844 个字符,预计需要花费 5 分钟才能阅读完成。
这篇文章将为大家详细讲解有关 MYSQL SOURCE 报错 ERROR: ASCII 怎么办,丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
由 ASCII \0 引起的 MYSQL SOURCE 错误
有一个朋友给出一个错误:
source test.sql
ERROR:
ASCII \0 appeared in the statement, but this is not allowed unless option
–binary-mode is enabled and mysql is run in non-interactive mode. Set –bin
ary-mode to 1 if ASCII \0 is expected. Query: .
以前没见过这个错误,于是仔细看了一下。先根据报错查看 –binary-mode 的意思:
–binary-mode By default, ASCII \0 is disallowed and \r\n is
translated to \n . This switch turns off both features,
and also turns off parsing of all clientcommands except
\C and DELIMITER, in non-interactive mode (for input
piped to mysql or loaded using the source command).
This is necessary when processing output from mysqlbinlog
that may contain blobs.
意思就是 ASCII \0 是不允许的,除非在 binary mode 下,为什么会不允许呢?
原因在于一个存文本模式的 sql 脚本不可能存在 \0 , \0 对应 ASCII 的 00,NUL,
我们知道在纯文本模式下,任何字符都对应自己的编码,即使是空格、换行、回车、制表符等
,00 NUL 只会在二进制模式的文件中才有,当使用非交互模式的时候,比如
在 mysqlbinlog|mysql -u root -p 时候是用会关闭,但是我测试了一下也不行
不管使用 pipe 管道还是重定向都不行:
[root@testmy ~]# cat test.sql|/mysqldata/mysql5.7/bin/mysql –socket=/mysqldata/mysql5.7/mysqld3307.sock
ERROR: ASCII \0 appeared in the statement, but this is not allowed unless option –binary-mode is enabled and mysql is run in non-interactive mode. Set –binary-mode to 1 if ASCII \0 is expected. Query: .
[root@testmy ~]# /mysqldata/mysql5.7/bin/mysql –socket=/mysqldata/mysql5.7/mysqld3307.sock test.sql = ERROR: ASCII \0 appeared in the statement, but this is not allowed unless option –binary-mode is enabled and mysql is run in non-interactive mode. Set –binary-mode to 1 if ASCII \0 is expected. Query: .
也许这种方式只有在导入 ROW 格式的 binlog 才会用到吧。
下面是重现方式,简单的代码:
#include
#include
int main(void)
{
FILE* fd;
char a= \0
if(!(fd = fopen( test.sql , a+)))
{
perror(error:
exit(1);
}
fputc(a,fd);
fputc(\n ,fd);
fclose(fd);
}
向 test.sql 写入一个 \0 即可,就可以重现了。下面是一个 ASCII 部分控制字符的截图
关于“MYSQL SOURCE 报错 ERROR: ASCII 怎么办”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。