如何解析MySQL5.5 Binlog中datetime(3)类型的字节数组为Timestamp
MySQL 5.5 Binlog中datetime(3)字节数组解析为Timestamp的方法
MySQL 5.5 Binlog里的datetime(3)类型以8字节大端序字节数组存储,解析成带毫秒精度的Timestamp的具体步骤如下:
- 拆分字节数组:将8字节分为前4字节(秒数部分)和后4字节(微秒/毫秒部分)
- 解析秒数部分:
- 把前4字节按大端序转换为无符号整数,该值代表从
0000-00-00 00:00:00到目标时间的总秒数 - 转换为Unix时间戳基准(1970-01-01 00:00:00 UTC)的秒数:用上述整数减去
62135596800(这是0000年到1970年的总秒数)
- 把前4字节按大端序转换为无符号整数,该值代表从
- 解析毫秒部分:
- 把后4字节按大端序转换为无符号整数,该值是微秒数(datetime(3)精度下,值为0、1000、2000...999000,对应0-999毫秒)
- 将微秒数除以1000,得到毫秒数
- 组合为Timestamp:
- 若需Unix毫秒时间戳:
(unix_seconds * 1000) + milliseconds - 若需带微秒的Timestamp(如Java的
java.sql.Timestamp):直接用unix_seconds作为秒数,加上microseconds_part作为微秒数
- 若需Unix毫秒时间戳:
注意事项
- 字节序必须是大端序(Binlog中整数默认以大端存储)
- MySQL的datetime类型不含时区信息,解析时需明确目标时区(如UTC或本地时区),若要转换为本地时间,需在Unix时间戳基础上做时区偏移调整
内容的提问来源于stack exchange,提问作者gee
相关产品推荐
相关产品推荐

