开发者社区> 问答> 正文

MySQL TIME类型字段,值为负数-00:00:00.12时解析的值错误,解析为正数00:00:

环境信息 canal version v1.1.5 mysql version 5.7.23

问题描述

MySQL字段类型为TIME时,写入值-00:00:00.12,canal解析出来的值变成了正数00:00:00.12。只有当时分秒都为0,并且毫秒值为负数时才会触发该问题。 看了下代码,应该是RowsLogBuffer解析的bug,第735行,判断正数部分为0后生成时间前缀"00:00:00",感觉应该同时判断下毫秒值,毫秒为负数时前缀需要加上负号:

String second = null; if (intpart == 0) { second = frac < 0 ? "-00:00:00" : "00:00:00"; } else {

原代码如下:

String second = null; if (intpart == 0) { second = "00:00:00"; } else {

步骤重现

建表语句如下:

CREATE DATABASE if not exists canal; CREATE TABLE canal.time2 ( id int(11) NOT NULL AUTO_INCREMENT, start_time TIME(2) NOT NULL COMMENT '时间', PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='time2测试表';

执行如下SQL写入数据:

insert into canal.time2(start_time) value('-00:00:00.12');

期待结果

canal可以正确解析出start_time负数字段值-00:00:00.12

实际执行情况

实际上canal解析出来的start_time字段值变成了正数00:00:00.12,负号丢掉了

原提问者GitHub用户clanmaps

展开
收起
后端老大 2023-04-26 10:03:59 116 0
1 条回答
写回答
取消 提交回答
  • 验证可修复

    原回答者GitHub用户agapple

    2023-04-26 18:25:34
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
神龙云服务器产品及技术深度解析 立即下载
弹性创造价值:基于ECS的最佳性价比实践解析 立即下载
又快又稳:阿里云下一代虚拟交换机解析 立即下载

相关镜像