首批通过分布式安全可靠测评,为关键业务系统打造
OceanBase 数据库类型转换规则
更新时间:2024-03-20 12:26
OceanBase 数据库 V4.2.x 版本支持所有 number 类之间的转换规则,在 MySQL 和 Oracle 语法中有不同的表示。
数值类型定义
数值类型虽然存储格式相同,但根据值域定义可以分为以下四种。
定点数
定义: 定点数(M,D) = {10^{-D}*i | i = 0,1,...,10^M-1}。其中, M 是自然数, D 是整数。
MySQL 语法: decimal(M, D),其中 65 >= M >= D >= 0。
Oracle 语法: number(M, D),其中 M 属于 [1, 38] 且 D 属于 [-84, 127]。
无符号定点数
定义:(M,D) = 定点数(M,D) 中的非负数。
MySQL 语法: 使用 decimal 类型加上 unsigned 属性。
Oracle 语法: 不支持。
浮点 number
定义: 浮点 number 是一个总精度为 38 位的浮点数。
它一定不是 oracle number(M,D) 的子集。
oracle number(M,D) 是它的子集当且仅当 M-D <= 38。
MySQL 语法:不支持。
Oracle 语法: number。
Oracle float
等价定义: real = float(63) 和 float = float(126)。
MySQL 语法:不支持。
Oracle 语法: float(P),其中 P 属于 [1, 126]。
转换规则
- 浮点 number 和 oracle float 只存在于 Oracle,而无符号定点数只存在于 MySQL 中;下表中的
-是指跨越了兼容模式的情况。 - instant 转换是指只修改 schema、无需重写数据的转换;
- 对于原生 Oracle,不允许 instant 转换是不允许非空表的转换(空表没有数据只修改 schema 即可);
- 对于 OceanBase 数据库 Oracle 模式,不允许 instant 转换是指空表/非空表都不能转换;
- 对于 OceanBase 数据库 MySQL 模式,不允许 instant 转换是指需要重写数据,即该 DDL 的时间和数据量成正比
- 即使允许 instant 转换,也不能保证所有源类型的数据都能无损地插入到目的类型中,例如定点数转 oracle float 。
| 允许 instant 转换(from\to) | 定点数(M2,D2) | 无符号定点数(M2,D2) | 浮点 number | oracle float(P2) |
|---|---|---|---|---|
| 定点数(M1,D1) | if D1 <= D2 and M1-D1 <= M2-D2 | no | if M-D <= 38 | if M1-D1 <= ceil(P*0.30103) |
ceil 是指取上整 关于 0.30103 | | 无符号定点数(M1,D1) unsigned | if D1 <= D2 and M1-D1 <= M2-D2 | if D1 <= D2 and M1-D1 <= M2-D2 | - | - | | 浮点 number | no | - | yes | no | | oracle float(P1) | no | - | yes | P1 <= P2 |
适用版本
OceanBase 数据库 V4.2.x 版本。