首批通过分布式安全可靠测评,为关键业务系统打造
列类型变更规则
更新时间:2026-02-25 11:17:58
在 OceanBase 数据库 Oracle 模式下进行列类型变更时,需要首先考虑表级的列类型变更规则,特别是一些数据类型的禁用场景;其次是考虑列类型变更中源数据类型和目标数据类型的变更规则。
表级列类型变更规则
禁用规则
外键约束
对于 Online DDL 和 Offline DDL,只支持
VARCHAR、VARCHAR2、NVARCHAR2数据类型的改大或改小精度。Trigger 约束
仅针对 Offline DDL,当列上有非
DISABLE的 Trigger 约束时,禁止修改列类型;如果全部是DISABLE的 Trigger,则不影响 DDL,并且新表里需要包含该DISABLETrigger。分区键
对于 Online DDL 和 Offline DDL,当列作为分区键一部分时,禁掉修改类型和修改长度的功能。
对于 Online DDL 和 Offline DDL,如果修改的列被生成列引用,则禁掉列类型变更功能。
变更规则
在相同数据类型长度变长的情况下,例如将某一列的数据类型
CHAR更改为CHAR(11),由于 OceanBase 数据库存储CHAR的方式可以是 Online 操作,也不需要重写数据,如果该列上只有索引表,那么可以通过 Online 的方式修改索引列的长度。但如果该列修改了主键或者分区键,则还是应该执行 Offline 操作,对于CHECK约束依赖的情况,因用户预期数据发生变长,可能导致不满足CHECK约束,此时也应该是执行 Offline 操作,即" 同类型变长有 CHECK 约束、主键、分区键要 Offline "。对于
VARCHAR类型的长度变长的情况,例如LENGTH(c1)这样的操作不会发生变化,所以可以通过 Online 的方式变更,但是需要同时修改索引表等相关依赖对象的 Schema。需要注意的是,这种情况即使变更了主键或者分区键,也可以是 Online 方式的,即" 用户预期数据不发生变化,但依赖对象中的 Schema 也要跟着改掉 "。在 OceanBase 数据库中,可能有相同大数据类型(即数值数据类型、字符数据类型、时间数据类型、
ROWID数据类型)的变更,如果该类上没有被索引表、外键、CHECK约束、主键等引用的情况,是可以通过 Online 的方式表更,但是如果被这些依赖对象引用,需要通过 Offline 的方式,即" 大类型变更有依赖对象要 Offline"。对于数值数据类型,如果出现
SIGNED和UNSIGNED变化,在允许类型变更的情况下,需要执行 Offline 操作。
列级变更规则
在 OceanBase 数据库中,所有列数类型分为五个大类,分别是数值数据类型、字符数据类型、时间数据类型、间隔数据类型和 ROWID 类型。
OceanBase 数据库当前版本中,ROWID 和 UROWID 类型实际在内部都实现成了 UROWID 类型,所以 ROWID和 UROWID 的转换规则,等同于 UROWID 与 UROWID 之间的转换规则。
在 OceanBase 数据库 Oracle 模式中大类型之间是不允许互相转换,因此,我们只关注大类型内部的转换。
数值数据类型大类内的转换
数值数据类型分为:
NUMBERFLOAT注意
FLOAT(p)不是浮点数,是NUMBER数据类型的子类型,它的二进制精度范围为 [1,126]。BINARY_FLOATBINARY_DOUBLE
如下表格为数值数据类型大类内的转换情况。
| 数据类型 | NUMBER | FLOAT | BINARY_FLOAT | BINARY_DOUBLE |
|---|---|---|---|---|
NUMBER |
支持 | 支持 | 禁止转换 | 禁止转换 |
FLOAT |
支持 | 支持 | 禁止转换 | 禁止转换 |
BINARY_FLOAT |
禁止转换 | 禁止转换 | 支持 | 禁止转换 |
BINARY_DOUBLE |
禁止转换 | 禁止转换 | 禁止转换 | 支持 |
字符数据类型大类内的转换
字符数据类型分为:
CHARVARCHAR、VARCHAR2:VARCHAR和VARCHAR2是同一个类型。NCHAR、NVARCHAR2:所有字符使用两个字节表示。BLOB:字符集是BINARY。CLOB:字符集是UTF8MB4。RAW:无论是哪种字符集,都以二进制形式存储。
如下表格为字符数据类型大类内的转换情况。
| 数据类型 | To CHAR | To VARCHAR、VARCHAR2 | To NCHAR | To NVARCHAR2 | To BLOB | To CLOB | To RAW |
|---|---|---|---|---|---|---|---|
CHAR |
支持 | 支持 | 支持 | 禁止转换 | 禁止转换 | 禁止转换 | 禁止转换 |
VARCHAR、VARCHAR2 |
支持 | 支持 | 支持 | 禁止转换 | 禁止转换 | 禁止转换 | 禁止转换 |
NCHAR |
禁止转换 | 禁止转换 | 支持 | 支持 | 禁止转换 | 禁止转换 | 禁止转换。 |
NVARCHAR2 |
禁止转换 | 禁止转换 | 支持 | 支持 | 禁止转换。 | 禁止转换 | 禁止转换。 |
BLOB |
禁止转换 | 禁止转换 | 禁止转换 | 禁止转换 | 支持 | 禁止转换 | 禁止转换 |
CLOB |
禁止转换 | 禁止转换 | 禁止转换 | 禁止转换 | 禁止转换 | 支持 | 禁止转换 |
RAW |
禁止转换 | 禁止转换 | 禁止转换 | 禁止转换 | 禁止转换 | 禁止转换 | 支持 |
日期时间数据类型大类内的转换
日期时间数据类型分为:
DATETIMESTAMPTIMESTAMP WITH TIME ZONETIMESTAMP WITH LOCAL TIME ZONE
如下表格为日期时间数据类型大类内的转换情况。
| 数据类型 | To DATE | To TIMESTAMP | To TIMESTAMP WITH TIME ZONE | To TIMESTAMP WITH LOCAL TIME ZONE |
|---|---|---|---|---|
DATE |
支持 | 支持 | 支持 | 支持 |
TIMESTAMP |
支持 | 支持 | 禁止转换 | 禁止转换 |
TIMESTAMP WITH TIME ZONE |
禁止转换 | 禁止转换 | 支持 | 禁止转换 |
TIMESTAMP WITH LOCAL TIME ZONE |
支持 | 禁止转换 | 禁止转换 | 支持 |
间隔数据类型大类内的转换
间隔数据类型分为:
INTERVAL YEAR TO MONTHINTERVAL DAY TO SECOND
如下表格为间隔数据类型大类内的转换情况。
| 数据类型 | To INTERVAL YEAR TO MONTH | To INTERVAL DAY TO SECOND |
|---|---|---|
| INTERVAL YEAR TO MONTH | 支持 | 禁止转换 |
| INTERVAL DAY TO SECOND | 禁止转换 | 支持 |
ROWID 数据类型大类内的转换
ROWID 数据类型分为:
ROWIDUROWID
如下表格为 ROWID 数据类型大类内的转换情况。
| 数据类型 | To ROWID | To UROWID |
|---|---|---|
| ROWID | 支持 | 支持 |
| UROWID | 支持 | 支持 |