---
title: "列类型变更规则 - OceanBase 数据库 V4.5.0 | OceanBase 文档中心"
description: 列类型变更规则 在 OceanBase 数据库 MySQL 模式下进行列类型变更时，需要首先考虑表级的列类型变更规则，特别是一些数据类型的禁用场景。其次是考虑列类型变更中源数据类型和目标数据类型的变更规则。 表级列类型变更规则 禁用规则 外键约束 对于 Online DDL 和 Offline DDL，除以下特殊情况…
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.5.0

# 列类型变更规则

更新时间：2026-03-28 18:04:13

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.5.0/zh-CN/700.reference/500.sql-reference/100.sql-syntax/200.common-tenant-of-mysql-mode/700.ddl-function-of-mysql-mode/900.column-type-change-rule-of-mysql-mode.md)  

在 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 的方式执行。
 - 在 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`、`VARCHAR`
 - `BINARY`、`VARBINARY`
 - `TEXT` 大类型：`TINYTEXT`、`MEDIUMTEXT`、`TEXT`、`LONGTEXT`
 - `BLOB` 大类型：`TINYBLOB`、`MEDIUMBLOB`、`BLOB`、`LONGBLOB`
 - `ENUM`、`SET`

如下表格为字符数据类型大类内的转换情况。

| 数据类型 | To CHAR | To BINARY | To VARCHAR\ VARBINARY | To TEXT\ BLOB | To ENUM\ SET |
| --- | --- | --- | --- | --- | --- |
| `CHAR` | 支持 | 支持 | 支持 | 支持 | 支持 |
| `BINARY` | 支持 | 支持 | 支持 | 支持 | 支持 |
| `VARCHAR`、 `VARBINARY` | 支持 | 支持 | 支持 | 支持 | 支持 |
| `TEXT`大类型、 `BLOB` 大类型 | 支持 | 支持 | 支持 | 支持 | 支持 |
| `ENUM`、 `SET` | 支持 | 支持 | 支持 | 支持 | 支持 |

### 时间类型大类内的转换

时间数据类型分为：

- `DATE`
 - `TIMESTAMP`
 - `DATETIME`
 - `TIME`
 - `YEAR`

如下表格为时间类型大类内的转换情况。

| 数据类型 | 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 | 支持 |

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
