开发者社区> 问答> 正文

对mysql blob类型的字段如果保存的是汉字UTF8编码(3子节),canal为什么会把它变成6

将汉字“我”保存在一个文本文件中然后通过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

展开
收起
数据大拿 2023-05-04 11:18:30 107 0
1 条回答
写回答
取消 提交回答
  • 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

    2023-05-05 10:12:56
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
搭建电商项目架构连接MySQL 立即下载
搭建4层电商项目架构,实战连接MySQL 立即下载
PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

相关镜像