---
title: github-fill
description: 列类型变更规则 在 OceanBase 数据库 Oracle 模式下进行列类型变更时，需要首先考虑表级的列类型变更规则，特别是一些数据类型的禁用场景；其次是考虑列类型变更中源数据类型和目标数据类型的变更规则。 表级列类型变更规则 禁用规则 外键约束 对于 Online DDL 和 Offline DDL，只支持 VA…
---
切换语言

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

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

# 列类型变更规则

更新时间：2026-02-25 11:17:58

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

在 OceanBase 数据库 Oracle 模式下进行列类型变更时，需要首先考虑表级的列类型变更规则，特别是一些数据类型的禁用场景；其次是考虑列类型变更中源数据类型和目标数据类型的变更规则。

## 表级列类型变更规则

### 禁用规则

- 外键约束

  对于 Online DDL 和 Offline DDL，只支持 `VARCHAR`、`VARCHAR2`、`NVARCHAR2` 数据类型的改大或改小精度。
 - Trigger 约束

  仅针对 Offline DDL，当列上有非 `DISABLE` 的 Trigger 约束时，禁止修改列类型；如果全部是 `DISABLE` 的 Trigger，则不影响 DDL，并且新表里需要包含该 `DISABLE` Trigger。
 - 分区键

  对于 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 模式中大类型之间是不允许互相转换，因此，我们只关注大类型内部的转换。

### 数值数据类型大类内的转换

数值数据类型分为：

- `NUMBER`
 - `FLOAT`

  #### 注意

  `FLOAT(p)` 不是浮点数，是 `NUMBER` 数据类型的子类型，它的二进制精度范围为 [1,126]。

     - `BINARY_FLOAT`
     - `BINARY_DOUBLE`

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

| 数据类型 | NUMBER | FLOAT | BINARY_FLOAT | BINARY_DOUBLE |
| --- | --- | --- | --- | --- |
| `NUMBER` | 支持 | 支持 | 禁止转换 | 禁止转换 |
| `FLOAT` | 支持 | 支持 | 禁止转换 | 禁止转换 |
| `BINARY_FLOAT` | 禁止转换 | 禁止转换 | 支持 | 禁止转换 |
| `BINARY_DOUBLE` | 禁止转换 | 禁止转换 | 禁止转换 | 支持 |

### 字符数据类型大类内的转换

字符数据类型分为：

- `CHAR`
 - `VARCHAR`、`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` | 禁止转换 | 禁止转换 | 禁止转换 | 禁止转换 | 禁止转换 | 禁止转换 | 支持 |

### 日期时间数据类型大类内的转换

日期时间数据类型分为：

- `DATE`
 - `TIMESTAMP`
 - `TIMESTAMP WITH TIME ZONE`
 - `TIMESTAMP 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 MONTH`
 - `INTERVAL DAY TO SECOND`

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

| 数据类型 | To INTERVAL YEAR TO MONTH | To INTERVAL DAY TO SECOND |
| --- | --- | --- |
| INTERVAL YEAR TO MONTH | 支持 | 禁止转换 |
| INTERVAL DAY TO SECOND | 禁止转换 | 支持 |

### ROWID 数据类型大类内的转换

`ROWID` 数据类型分为：

- `ROWID`
 - `UROWID`

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

| 数据类型 | To ROWID | To UROWID |
| --- | --- | --- |
| ROWID | 支持 | 支持 |
| UROWID | 支持 | 支持 |

 上一篇 下一篇 ![有帮助](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) 咨询热线
