首批通过分布式安全可靠测评,为关键业务系统打造
列类型变更规则
更新时间:2026-03-28 18:04:13
在 OceanBase 数据库 MySQL 模式下进行列类型变更时,需要首先考虑表级的列类型变更规则,特别是一些数据类型的禁用场景。其次是考虑列类型变更中源数据类型和目标数据类型的变更规则。
表级列类型变更规则
禁用规则
外键约束
对于 Online DDL 和 Offline DDL,除以下特殊情况(需要注意,所涉及的类型修改只改变显示精度,而不改变存储结构)的其他场景都不支持修改外键列类型。
如果列的数据类型是
FLOAT(m,n),则支持更改精度大小,但不支持SIGNED和UNSIGNED的互相转换。如果列的数据类型是
DOUBLE(m,n),则支持更改精度大小,但不支持SIGNED和UNSIGNED的互相转换。如果列的数据类型是
VARCHAR(m),则支持改大精度,不支持改小精度,并且不支持改成CHAR类型。
CHECK约束对于 Online DDL 和 Offline DDL,除了整数类型(
INTEGER)的列之外,具有CHECK约束的列不支持修改列类型。Trigger 约束
仅针对 Offline DDL,当列上有非
DISABLE的 Trigger 约束时,禁止修改列类型;如果全部是DISABLE的 Trigger,则不影响 DDL 操作,并且新表里需要包含此DISABLE的 Trigger。
变更规则
在相同数据类型长度变长的情况下,例如将某一列的数据类型
VARCHAR(8)更改为VARCHAR(11),此操作可以作为 Online DDL 进行,无需重新写入数据。- 如果通过 Online DDL 的方式修改列的长度,并且该列上有索引表的情况(比如
VARCHAR类型的长度变长),通过 Online DDL 的方式变更的同时,也需要修改索引表等相关依赖对象的 Schema,即 "用户预期数据不发生变化,但依赖对象中的 Schema 也要跟着改掉"。 - 对于
INTEGER和DecimalInt类型的列,如果它们是索引列或主键列,那么列类型增长的操作可以通过 Online DDL 的方式执行。
- 如果通过 Online DDL 的方式修改列的长度,并且该列上有索引表的情况(比如
在 OceanBase 数据库中,对于
LOB类型的增长,Online DDL 操作支持以下情形:- 普通列的修改。
- 作为生成列(Store/Virtual)的修改
- 被生成列依赖(Store/Virtual)的修改
- 增加
NOT NULL和CHECK约束。 - 修改原有的
NOT NULL约束。
对于数值数据类型,如果出现
SIGNED和UNSIGNED的转换,在允许类型变更的情况下,需要执行 Offline 操作;对于字符数据类型,如果出现字符集和字符序 Collation 变更,在允许列类型变更的情况下,需要执行 Offline 操作。当某一列被生成列引用时,允许列类型的变更操作。
列级转换规则
在 OceanBase 数据库中,所有列数类型分为三个大类,分别是数值数据类型、字符数据类型和时间数据类型。这三个大类内的转换规则是类似的,每种大类之间的变更规则也是类似的,但是也有一些特殊情况。
如下各表分别列举每种大类内部的和大类之间的转换情况。
数值数据类型大类内的转换
数值数据类型分为:
整型:
TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT浮点型:
FLOAT、DOUBLE定点型:
NUMBER二进制:
BIT
如下表格为数值数据类型大类内的转换情况。
| 数据类型 | To TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT | To FLOAT、DOUBLE | To NUMBER | To BIT |
|---|---|---|---|---|
| 整型 | 支持 | 支持 | 支持 | 支持 |
| 浮点型 | 支持 | 支持 | 支持 | 支持 |
| 定点型 | 支持 | 支持 | 支持 | 支持 |
| 二进制 | 支持 | 支持 | 支持 | 支持 |
字符数据类型大类内的转换
字符数据类型分为:
CHAR、VARCHARBINARY、VARBINARYTEXT大类型:TINYTEXT、MEDIUMTEXT、TEXT、LONGTEXTBLOB大类型:TINYBLOB、MEDIUMBLOB、BLOB、LONGBLOBENUM、SET
如下表格为字符数据类型大类内的转换情况。
| 数据类型 | To CHAR | To BINARY | To VARCHAR\ VARBINARY | To TEXT\ BLOB | To ENUM\ SET |
|---|---|---|---|---|---|
CHAR |
支持 | 支持 | 支持 | 支持 | 支持 |
BINARY |
支持 | 支持 | 支持 | 支持 | 支持 |
VARCHAR、 VARBINARY |
支持 | 支持 | 支持 | 支持 | 支持 |
TEXT大类型、 BLOB 大类型 |
支持 | 支持 | 支持 | 支持 | 支持 |
ENUM、 SET |
支持 | 支持 | 支持 | 支持 | 支持 |
时间类型大类内的转换
时间数据类型分为:
DATETIMESTAMPDATETIMETIMEYEAR
如下表格为时间类型大类内的转换情况。
| 数据类型 | To DATE | To TIMESTAMP | DATETIME | TIME | YEAR |
|---|---|---|---|---|---|
DATE |
支持 | 支持 | 支持 | 支持 | 支持 |
TIMESTAMP |
支持 | 支持 | 支持 | 支持 | 支持 |
DATETIME |
支持 | 支持 | 支持 | 支持 | 支持 |
TIME |
支持 | 支持 | 支持 | 支持 | 支持 |
YEAR |
支持 | 支持 | 支持 | 支持 | 支持 |
数值型大类和字符型大类间的转换
数值型大类和字符型大类间的转换情况如下表所示。
| 数据类型 | To 整型、浮点型、定点型 | To BIT 类型 | To CHAR、BINARY、 VARCHAR 、VARBINARY、 TEXT 大类、 BLOB 大类 | To ENUM、SET |
|---|---|---|---|---|
| 整型、浮点型、定点型 | 参见大类内的转换规则。 | 参见大类内的转换规则。 | 支持 | 支持 |
BIT 类型 |
参见大类内的转换规则。 | 参见大类内的转换规则。 | 支持 | 支持 |
CHAR、BINARY 、VARCHAR 、VARBINARY 、TEXT 大类、 BLOB 大类 |
支持 | 支持 | 参见大类内的转换规则。 | 支持 |
ENUM、SET |
支持 | 支持 | 参见大类内的转换规则。 | 参见大类内的转换规则。 |
数值型大类和时间大类间的转换
数值型大类和时间大类间的转换情况如下表所示。
| 数据类型 | To 整型、浮点型、定点型、BIT |
To DATE | To DATETIME | To TIMESTAMP | To TIME | To YEAR |
|---|---|---|---|---|---|---|
整型、浮点型、定点型、BIT |
参见大类内的转换规则。 | 支持 | 支持 | 支持 | 支持 | 支持 |
DATE |
支持 | 参见大类内的转换规则。 | 参见大类内的转换规则。 | 参见大类内的转换规则。 | 参见大类内的转换规则。 | 参见大类内的转换规则。 |
DATETIME |
支持 | 参见大类内的转换规则。 | 参见大类内的转换规则。 | 参见大类内的转换规则。 | 参见大类内的转换规则。 | 参见大类内的转换规则。 |
TIMESTAMP |
支持 | 参见大类内的转换规则。 | 参见大类内的转换规则。 | 参见大类内的转换规则。 | 参见大类内的转换规则。 | 参见大类内的转换规则。 |
TIME |
支持 | 参见大类内的转换规则。 | 参见大类内的转换规则。 | 参见大类内的转换规则。 | 参见大类内的转换规则。 | 参见大类内的转换规则。 |
YEAR |
支持 | 参见大类内的转换规则。 | 参见大类内的转换规则。 | 参见大类内的转换规则。 | 参见大类内的转换规则。 | 参见大类内的转换规则。 |
字符型大类和时间大类间的转换
字符型大类和时间大类间的转换情况如下表所示。
| 数据类型 | To CHAR、BINARY 、VARCHAR 、VARBINARY 、TEXT 大类、 BLOB 大类 | To ENUM、 SET | To DATE | To DATETIME | To TIMESTAMP | To TIME | To YEAR |
|---|---|---|---|---|---|---|---|
CHAR、BINARY、VARCHAR、VARBINARY 、TEXT 大类、BLOB 大类 |
参见大类内的转换规则。 | 参见大类内的转换规则。 | 支持 | 支持 | 支持 | 支持 | 支持 |
ENUM、 SET |
参见大类内的转换规则。 | 参见大类内的转换规则。 | 支持 | 支持 | 支持 | 支持 | 支持 |
DATE |
支持 | 支持 | 参见大类内的转换规则。 | 参见大类内的转换规则。 | 参见大类内的转换规则。 | 参见大类内的转换规则。 | 参见大类内的转换规则。 |
DATETIME |
支持 | 支持 | 参见大类内的转换规则。 | 参见大类内的转换规则。 | 参见大类内的转换规则。 | 参见大类内的转换规则。 | 参见大类内的转换规则。 |
TIMESTAMP |
支持 | 支持 | 参见大类内的转换规则。 | 参见大类内的转换规则。 | 参见大类内的转换规则。 | 参见大类内的转换规则。 | 参见大类内的转换规则。 |
TIME |
支持 | 支持 | 参见大类内的转换规则。 | 参见大类内的转换规则。 | 参见大类内的转换规则。 | 参见大类内的转换规则。 | 参见大类内的转换规则。 |
YEAR |
支持 | 支持 | 参见大类内的转换规则。 | 参见大类内的转换规则。 | 参见大类内的转换规则。 | 参见大类内的转换规则。 | 参见大类内的转换规则。 |
Online DDL 列类型向上转换场景
整形的转换
| 数据类型 | To SMALLINT | To MEDIUMINT | To INT | To BIGINT |
|---|---|---|---|---|
| TINYINT | 支持 | 支持 | 支持 | 支持 |
| SMALLINT | N/A | 支持 | 支持 | 支持 |
| MEDIUMINT | 不支持 | N/A | 支持 | 支持 |
| INT | 不支持 | 不支持 | N/A | 支持 |
| 数据类型 | To USMALLINT | To UMEDIUMINT | To UINT | To UBIGINT |
|---|---|---|---|---|
| UTINYINT | 支持 | 支持 | 支持 | 支持 |
| USMALLINT | N/A | 支持 | 支持 | 支持 |
| UMEDIUMINT | 不支持 | N/A | 支持 | 支持 |
| UINT | 不支持 | 不支持 | N/A | 支持 |
DECIMAL/DECIMALINT
DECIMAL(precision, scala) 表示一个十进制数类型,其中 precision 表示数字的总长度,scala 表示小数部分的位数。precision 在 Online DDL 时的精度区间有 [1, 9]、[10, 18]、[19, 38] 和 [39, 65]。
注意
- 在 Oracle 模式下
precision最大为 38。 - 在 MySQL 模式下
precision最大为 65。
当 precision 长度在同一个范围内,并且 scala 不变的情况下,底层物理存储不会改变,可以通过 Online DDL 进行修改。例如,如果从 DECIMAL(10, 2) 变为 DECIMAL(12, 2),可以使用 Online DDL 进行修改。
对于第一个参数
precision的变化,如果变长(即增加precision的长度),可以通过 Online DDL 进行修改。例如,从DECIMAL(10, 2)变为DECIMAL(12, 2),可以使用 Online DDL 进行修改。然而,如果变短(即减少precision的长度),则无法使用 Online DDL 进行修改,需要使用 Offline DDL 进行修改。跨区间需要使用 Offline DDL 进行修改。对于第二个参数
scala的变化,无论是变长还是变短,都需要使用 Offline DDL 进行修改,即无法使用 Online DDL。例如,从DECIMAL(10, 2)变为DECIMAL(10, 4),或者从DECIMAL(10, 2)变为DECIMAL(10, 1),都需要使用 Offline DDL 进行修改。
VARCHAR 变长
如果要将 VARCHAR(x) 转换为 VARCHAR(y),只需确保 y 的长度大于等于 x 的长度,就可以使用 Online DDL 向上修改的列类型。例如,如果要将 VARCHAR(10) 转换为 VARCHAR(20),可以使用 Online DDL 来修改列类型。
VARBINARY 变长
如果要将 VARBINARY(x) 转换为 VARBINARY(y),只需确保 y 的长度大于等于 x 的长度,就可以使用 Online DDL 向上修改的列类型。例如,如果要将 VARBINARY(10) 转换为 VARBINARY(20),可以使用 Online DDL 来修改列类型。
大数据类型
注意
LOB 列不能作为索引和主键。
| 数据类型 | To MEDIUMBLOB | To LONGBLOB |
|---|---|---|
| BLOB | 支持 | 支持 |
| MEDIUMBLOB | N/A | 支持 |
| 数据类型 | To MEDIUMTEXT | To LONGTEXT |
|---|---|---|
| TEXT | 支持 | 支持 |
| MEDIUMTEXT | N/A | 支持 |
VARCHAR 与 TINYTEXT 互相转换
| 数据类型 | To VARCHAR(x),x>=255 | To TINYTEXT |
|---|---|---|
| TINYTEXT | 支持 | N/A |
| VARCHAR(x),x<=255 | N/A | 支持 |
VARBINARY 与 TINYBLOB 互相转换
| 数据类型 | To VARBINARY(x),x>=255 | To TINYBLOB |
|---|---|---|
| TINYBLOB | 支持 | N/A |
| VARBINARY(x),x<=255 | N/A | 支持 |