将汉字“我”保存在一个文本文件中然后通过insert语句插入mysql数据库的myblob字段。通过hexdump命令可以看到 文件子节内容为 e68891(8进制\346\210\221),在mysqlbinlog中保存的也是e68891,但是通过canal传输后在CanalEntry中保存的内容却变成了“\303\246\302\210\302\221”。
将3子节变成了6子节而且加上了c3 c2c2. 请教一下是什么参数控制了这种行为。如果想保持原来的编码(e68891 或 \346\210\221 )而不想进行这种转化该如何配置?
========================== (文本文件内容)$ hexdump a.txt 0000000 88e6 0091 0000003
(binlog文件保存的内容) 0032020 adf8 03e0 0000 e600 9188 3cc2 8fb5 ed24
(mysql表结构) | mytable | CREATE TABLE mytable ( id int(11) DEFAULT NULL, name varchar(64) DEFAULT NULL, mytime datetime DEFAULT NULL, myblob longblob ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
(canal的配置文件) canal.instance.connectionCharset = UTF-8
(canal的内容) Receive=> header { version: 1 logfileName: "mysql-bin.000005" logfileOffset: 205692 serverId: 1 serverenCode: "UTF-8" executeTime: 1566966900000 sourceType: MYSQL schemaName: "mydb" tableName: "mytable" eventLength: 58 eventType: INSERT props { key: "rowsCount" value: "1" } } entryType: ROWDATA storeValue: "\bW\020\001P\000b\234\001\022\032\b\000\020\004\032\002id \000(\0010\000B\0017R\aint(11)\022$\b\001\020\f\032\004name \000(\0010\000B\005test1R\vvarchar(64)\0221\b\002\020]\032\006mytime \000(\0010\000B\0232019-08-28 12:35:00R\bdatetime\022%\b\003\020\324\017\032\006myblob \000(\0010\000B\006\303\246\302\210\302\221R\blongblob"
(rowdata的内容) Receive tableId: 87 eventType: INSERT isDdl: false rowDatas { afterColumns { index: 0 sqlType: 4 name: "id" isKey: false updated: true isNull: false value: "7" mysqlType: "int(11)" } afterColumns { index: 1 sqlType: 12 name: "name" isKey: false updated: true isNull: false value: "test1" mysqlType: "varchar(64)" } afterColumns { index: 2 sqlType: 93 name: "mytime" isKey: false updated: true isNull: false value: "2019-08-28 12:35:00" mysqlType: "datetime" } afterColumns { index: 3 sqlType: 2004 name: "myblob" isKey: false updated: true isNull: false value: "\303\246\302\210\302\221" mysqlType: "longblob" } }
原提问者GitHub用户fanguoteng
if (StringUtils.containsIgnoreCase(column.getMysqlType(), "BLOB") || StringUtils.containsIgnoreCase(column.getMysqlType(), "BINARY")) { // get value bytes builder.append(column.getName() + " : " + new String(column.getValue().getBytes("ISO-8859-1"), "UTF-8")); } else { builder.append(column.getName() + " : " + column.getValue()); }
example代码里有
原回答者GitHub用户agapple
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。