基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
show create table 展示 TIMESTAMP 类型分区键显示有问题
更新时间:2026-08-25 08:16
问题现象
在 OceanBase 数据库中,当分区键的数据类型为 TIMESTAMP(0) 时,使用 show create table 命令查看表结构,分区键的值显示多出了一个小数点,例如显示为 partition "P201903" values less than (Timestamp '2019-04-01 00:00:00.')。这种显示异常会导致 OMS 同步 DDL 语句创建表时出现语法错误 OBE-01861: literal does not match format string。
show create table输出中,分区键值显示为Timestamp '2019-04-01 00:00:00.',时间字符串末尾多出一个小数点。- 使用
show create table的输出作为建表语句执行时,报错OBE-01861: literal does not match format string。
关键诊断信息
触发条件
- 该问题出现在所有版本的 OceanBase 数据库中。
- 分区键的数据类型为 TIMESTAMP(0) 时,使用
show create table命令查看表结构。
事后诊断
复现案例如下:
- 创建分区键为 TIMESTAMP(0) 类型的表:
CREATE TABLE TEST11(
"VID" VARCHAR2(40) NOT NULL ENABLE,
"CREATERECORDTIME" TIMESTAMP(0) NOT NULL ENABLE,
"UPDATERECORDTIME" TIMESTAMP(0),
"TOUSERNAME" VARCHAR2(30),
"FROMUSERNAME" VARCHAR2(40),
"CREATETIME" VARCHAR2(25),
"MSGTYPE" VARCHAR2(8),
"EVENT" VARCHAR2(15),
"EVENTKEY" VARCHAR2(20),
CONSTRAINT "PK_TEST11" PRIMARY KEY ("VID", "CREATERECORDTIME")
) COMPRESS FOR ARCHIVE REPLICA_NUM = 3 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0
partition by range(CREATERECORDTIME)
(partition "P201903" values less than (Timestamp '2019-04-01 00:00:00'),
partition "PMAX" values less than (MAXVALUE));
- 执行
show create table TEST11;查看表结构,输出中的分区定义如下,分区键值末尾多出一个小数点:
partition by range(CREATERECORDTIME)
(partition "P201903" values less than (Timestamp '2019-04-01 00:00:00.'),
partition "PMAX" values less than (MAXVALUE))
- 使用
show create table的输出作为建表语句执行,报语法错误:
obclient> CREATE TABLE "TEST112" (
-> "VID" VARCHAR2(40) NOT NULL ENABLE,
-> "CREATERECORDTIME" TIMESTAMP(0) NOT NULL ENABLE,
-> "UPDATERECORDTIME" TIMESTAMP(0),
-> "TOUSERNAME" VARCHAR2(30),
-> "FROMUSERNAME" VARCHAR2(40),
-> "CREATETIME" VARCHAR2(25),
-> "MSGTYPE" VARCHAR2(8),
-> "EVENT" VARCHAR2(15),
-> "EVENTKEY" VARCHAR2(20),
-> CONSTRAINT "PK_TEST112" PRIMARY KEY ("VID", "CREATERECORDTIME")
-> ) COMPRESS FOR ARCHIVE REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE ENABLE_MACRO_BLOCK_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0
-> partition by range(CREATERECORDTIME)
-> (partition "P201903" values less than (Timestamp '2019-04-01 00:00:00.'),
-> partition "PMAX" values less than (MAXVALUE));
OBE-01861: literal does not match format string
问题原因
该问题由 OceanBase 数据库 Oracle 模式下 show create table 命令的展示格式缺陷导致。当分区键的数据类型为 TIMESTAMP(0)(即精度为 0,不需要小数秒)时,show create table 在展示时间字符串后添加了一个小数点,但没有跟随任何小数位数字,从而导致了显示上的问题。如果下游工具直接执行 show create table 的输出内容,会报错 OBE-01861: literal does not match format string。该问题在所有版本中都存在。 TIMESTAMP 数据类型定义:TIMESTAMP 或 TIMESTAMP(p),其中 p=0~9 表示秒的小数精度,缺省为 6。 字面量写法:TIMESTAMP 'YYYY-MM-DD HH24:MI:SS[.FF]' 示例:TIMESTAMP '2019-04-01 00:00:00'、TIMESTAMP '2025-12-21 12:34:56.123456789' TIMESTAMP(4) 保留到毫秒后 4 位(1/10,000 秒),示例如下:
CREATE TABLE t (
id NUMBER,
ts TIMESTAMP(4)
);
INSERT INTO t VALUES (1, TIMESTAMP '2025-12-21 12:34:56.1234567');
-- 存储为 2025-12-21 12:34:56.1235(超出部分四舍五入)
原生 Oracle 的行为:展示 DDL 时尾部是不带点的。原生 Oracle 展示行(to_char)时确认是尾部带点的,但并不能构造成 Timestamp,show create table 展示时需要特殊处理。
问题的风险及影响
- OMS 同步创建表时可能因为显示异常而失败。
- 影响数据库表的正常创建和管理。
影响租户
| sys | MySQL | Oracle |
|---|---|---|
| NO | NO | YES |
影响版本
该问题影响所有版本的 OceanBase 数据库。
解决方法
若需立即解决问题,可参考下文"规避方式"。
规避方式
- 将 TIMESTAMP(0) 改为 TIMESTAMP(1) 或更高精度:
"CREATERECORDTIME" TIMESTAMP(1) NOT NULL ENABLE,
(partition "P201903" values less than (Timestamp '2019-04-01 00:00:00.0'))
- 不指定精度,使用默认值:
"CREATERECORDTIME" TIMESTAMP NOT NULL ENABLE,
(partition "P201903" values less than (TO_DATE('2019-04-01', 'YYYY-MM-DD')))
- 如果不需要时间精度,可以使用 DATE 类型:
"CREATERECORDTIME" DATE NOT NULL ENABLE,
(partition "P201903" values less than (TO_DATE('2019-04-01', 'YYYY-MM-DD')))