+ -
当前位置:首页 → 问答吧 → mysqlbinlog生成sql语句时,\0字符串引发的问题

mysqlbinlog生成sql语句时,\0字符串引发的问题

时间:2011-12-09

来源:互联网

CREATE TABLE `x` (
  `msg` varchar(256) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
-------------------
【c++,using mysqlpp】
C/C++ code

string insertSQL = string("insert into test.x values('\0\0hello')"); //字符串里面有\0字符
query << insertSql;
SimpleResult res;
conn.execute(res,query);


---------------------
SQL code

mysql> select * from test.x;
+---------+
| msg     |
+---------+
|   hello | 
+---------+
1 row in set (0.00 sec)

mysql> select hex(msg) from test.x;
+----------------+
| hex(msg)       |
+----------------+
| 000068656C6C6F | 
+----------------+
1 row in set (0.00 sec)


--------------------------
mysqlbinlog生成的sql语句
SQL code

insert into test.x values('^@^@hello');    /* 注意^@是vi显示的结果,用hexdump查看ASCII为0 */


--------------------------

问题来了,
这样执行mysqlbinlog mysql-bin.000xx | mysql
这样的语句直接用mysql执行会出现语法错误(那个^@,也就是\0)把字符串截断了,于是出现语法错误

请问怎样让mysqlbinlog生成正确的经过转义的sql语句呢(将^@变成字符串"\0")?或者让mysql在执行的时候可以支持中间为\0的字符串?

作者: nofreezou   发布时间: 2011-12-09

你是在什么中执行? C中还是MYSQL命令行工具中?

作者: ACMAIN_CHM   发布时间: 2011-12-09

引用 1 楼 acmain_chm 的回复:

你是在什么中执行? C中还是MYSQL命令行工具中?


mysql命令行中执行,类似这样的命令“mysqlbinlog mysql-bin.xx| mysql”
通过mysqlbinlog读取binlog文件,生成sql,然后用mysql执行

作者: nofreezou   发布时间: 2011-12-09

我现在通过字符串替换把^@ (hex(0)) 的手动替换成\0(hex(5C30))可以完成导入,不知道是否还有更妥当的方法?

作者: nofreezou   发布时间: 2011-12-09

mysql4.1版本?
我也出现过binlog生成的就是不对的,后来只好迁移到高版本的mysql上

作者: rucypli   发布时间: 2011-12-09