binlog2sql icon indicating copy to clipboard operation
binlog2sql copied to clipboard

Set类型解析有问题

Open lujinke opened this issue 6 years ago • 4 comments

CREATE TABLE `ttt` (
  `id` int(11) NOT NULL,
  `c1` set('a','b','c') COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `c2` bit(16) DEFAULT NULL,
  `c3` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci

insert into ttt values(1,'c,a',b'11111','{"a":\'M&s\',"c":"asda"}');

解析出来的sql如下:

INSERT INTO `test`.`ttt`(`c3`, `c2`, `c1`, `id`) VALUES ('{\"a\":\'M&s\',\"c\":\"asda\"}', '0000000000011111', ('a','c'), 1);

set类型的值需要做处理,要用逗号join一下

lujinke avatar May 30 '18 01:05 lujinke

谢谢反馈,已修复,fdb3fbd3d7138b9d6b9ce4744b0a886e2df25053

danfengcao avatar May 30 '18 04:05 danfengcao

不好意思,提issue的时候忘记我自己对解析出来的set做了排序,所以上面说join可以解决问题,但是前提是你必须对解析出来的set做排序,我提了一个类似的bug给python-mysql-replication,你可以看看这里:issue 268

同样的,对于bit类型的处理也有问题:

INSERT INTO `test`.`ttt`(`c3`, `c2`, `c1`, `id`) VALUES ('{\"a\":\'M&s\',\"c\":\"asda\"}', '0000000000011111', ('a','c'), 1);

上面的'0000000000011111'应为b'0000000000011111',需要在前面加上b前缀,否则插入时会报错(取决于sql_mode),用解析出来的值进行匹配时,也会匹配错误。

lujinke avatar May 31 '18 10:05 lujinke

好的,多谢反馈。bit和binary都有问题,我来修复

danfengcao avatar Jun 01 '18 06:06 danfengcao

python-mysql-replication把bit类型返回成了string类型,L244,需要提pr

danfengcao avatar Jun 01 '18 09:06 danfengcao