首批通过分布式安全可靠测评,为关键业务系统打造
Datetime 为 0 时,Go 驱动结果为负数
更新时间:2026-05-18 09:11
问题现象
PS 协议下,关于 datetime 类型的 zero datetime 值(0000-00-00 00:00:00),OceanBase 数据库内核在给客户端发包的时候没有做到完全与 MySQL 兼容,导致 Go 驱动客户端下查询结果为负数。
问题原因
MySQL 数据库针对 zero datetime 值,会给客户端返回一个长度 0 的包,客户端驱动(Go、MySQL-JDBC)收到这个数据,将其解析为(0000-00-00 00:00:00)。
OceanBase 数据库由于没有完全兼容 MySQL 的上述行为,所以之前针对 zero datetime 值,会给客户端返回一个长度 11 的包,OB-JDBC 会把这个值进一步解析为(0000-00-00 00:00:00)。但是在客户端使用 Go 驱动的时候,上述这个长度为 11 的包,被解析为了一个负值(-0001-11-30 00:00:00)。
影响版本
OceanBase 数据库 V3.1.2 BP11(oceanbase-3.1.2-111000052023010412)、V3.2.3 BP9(oceanbase-3.2.3.3-109000182023071410)、V3.2.4 BP4(oceanbase-3.2.4.4-104000052023062021)、V2.2.77 BP18(oceanbase-2.2.77-118000012023052520)、V4.1.0 BP2(oceanbase-4.1.0.1-102000042023061309)及之前版本。
解决方法及规避方式
关闭 PS 协议。
升级到问题已修复版本,目前已修复的版本包含 OceanBase V3.2.3 BP10(oceanbase-3.2.3.3-110000092023091219)、V3.2.4 BP5(oceanbase-3.2.4.5-105000012023081513)、V4.1.0 BP3(oceanbase-4.1.0.2-103000072023081111)、V4.2.0 Beta(oceanbase-4.2.0.0-100000052023073123)。
<main id="notice" type='notice'> <h4>注意</h4> <p> 升级到问题已修复的 OceanBase 数据库版本后,如果配合 JDBC V2.4.0 版本使用,<code>zerodatetime</code> 会由原来的查询结果 0000-00-00 00:00:00 变为 Null 值。如有问题建议升级最新版本的 JDBC。</p> </main>