CREATE TABLE `x` (
  `msg` varchar(256) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
-------------------
【c++,using mysqlpp】string insertSQL = string("insert into test.x values('\0\0hello')"); //字符串里面有\0字符
query << insertSql;
SimpleResult res;
conn.execute(res,query);---------------------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语句insert into test.x values('^@^@hello');    /* 注意^@是vi显示的结果,用hexdump查看ASCII为0 */--------------------------问题来了,
这样执行mysqlbinlog mysql-bin.000xx | mysql
这样的语句直接用mysql执行会出现语法错误(那个^@,也就是\0)把字符串截断了,于是出现语法错误请问怎样让mysqlbinlog生成正确的经过转义的sql语句呢(将^@变成字符串"\0")?或者让mysql在执行的时候可以支持中间为\0的字符串?

解决方案 »

  1.   

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

  2.   


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

  3.   

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

  4.   

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

  5.   

    mysql5.1.54我发现是mysql读输入文件有问题,读到\0就认为i是文件结束了