【问题现象】

在将一张 Oracle 表迁移至 YashanDB 后,执行插入操作时报如下错误:

SQL 错误 [13] [22000]: [line: 0 column: 0] YAS-00013 value is larger than INTEGER allowed

而在 Oracle 中相同语句执行无误。为什么?

image.png

【根本原因】

这其实是 字段类型默认映射差异 所致。

image.png

  1. INT 类型的最大值有限

YashanDB 遵循标准 SQL 类型规范:

INT 类型的取值范围为:
-2,147,483,648 ~ 2,147,483,647

而报错中的数值是 16 位长整型,显然超出了 INT 类型的表示范围。

image.png

  1. Oracle 的 INT ≠ 标准 INT

虽然 Oracle 中也支持 INT 写法,但实际上它会自动映射为 NUMBER 类型,精度更高,因此在 Oracle 中可以插入更大的整数。

例如:

-- 实际上这在 Oracle 中是等价于:
CREATE TABLE t_test (id NUMBER);

【解决方法】

修改字段类型为 BIGINT 或 NUMBER

为了兼容大整数建议统一使用以下字段定义:

-- 推荐写法

CREATE TABLE t_test (
  id NUMBER  -- 或者使用 BIGINT
);

避免使用 INT 类型,尤其是在可能接收超过 10 位整数的场景中。

【迁移建议】

在从 Oracle 向 YashanDB 迁移时:
image.png

建议在迁移前,使用工具或脚本自动识别并调整超范围字段,避免插入报错。

【影响版本】

适用于 YashanDB 所有版本

【总结】

YashanDB 中 INT 是严格 32 位整数;

Oracle 的 INT 实际上通常是 NUMBER,支持大整数;

避免直接照搬字段类型,迁移时应注意数据精度范围;

建议统一使用 NUMBER 类型接收未知位数的整型字段。


数据库砖家
1 声望0 粉丝