暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle运维实践|当遇到数据类型NUMBER

引言

有了导入计划和导入方案,剩下的就是本地测试和线上实操。下面是实际工作步骤。Oracle内置数据类型有很多种,例如字符数据类型、数值数据类型、整型数据类型、日期和间隔数据类型、RAW数据类型、大对象数据类型、扩展数据类型。今日就折在了数值上了。

具象问题

按照数据组提供的表结构创建了表,在将csv文件导入到oracle库时遇到的错误问题如下:

ORA-01438: value larger than specified precision allowed for this column

翻译下就是

值大于此列允许的指定精度。

前同事在设置数据类型可能并没有考虑大很大的数值或者由于新数据的加入,之前设置的数据类型不能满足当前的数据存储进去。下面再来回顾和学习下这个数据类型。

Oracle版本疑问

我在做测试时,还发现了一个问题就是在11G和19C上都设置了同样的数据类型,却无法存储相同的数据,具体的原因我没有深究,也不知道如何下手,这里只讲述下问题以及发现的问题现象,也希望大佬们能教教我。

Oracle-11G

这个版本是我本地数据库和线上数据库,其中本地数据库对于Oracle-11G的版本,查询出来是 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production ,数据库设置的字符集编码为 ZHS16GBK,而线上的数据库的编码设置为 AL32UTF8

我在测试使用11时,使用到的测试数据如下,创建表,插入数据,失败。???此处写了一个大大的问号❓

## 创建表
CREATE TABLE "TEST" (
  "PRIMARY_ID" NUMBER,
  "CAPITAL" NUMBER(10,3),
  "ITEM_NAME" VARCHAR2(255 BYTE)
)
;
COMMENT ON COLUMN "TEST"."PRIMARY_ID" IS '主键-';
COMMENT ON COLUMN "TEST"."CAPITAL" IS '价格';
COMMENT ON COLUMN "TEST"."ITEM_NAME" IS '项目';

## 插入数据
INSERT INTO "TEST" ("PRIMARY_ID", "CAPITAL", "ITEM_NAME") VALUES
 (21290151, '202412', 438048000);
INSERT INTO "TEST" ("PRIMARY_ID", "CAPITAL", "ITEM_NAME") VALUES
 (21290152, '202412', 4380480);
INSERT INTO "TEST" ("PRIMARY_ID", "CAPITAL", "ITEM_NAME") VALUES
 (21290153, '202412', 43804);

Oracle-19C

对于Oracle-19C的版本,查询出来是Oracle Database 19c EE Extreme Perf Release 19.0.0.0.0 - Production字符集设置的编码为 ZHS16GBK 。测试数据同上,创建表,插入数据,成功

## 创建表
CREATE TABLE "TEST" (
  "PRIMARY_ID" NUMBER,
  "CAPITAL" NUMBER(10,3),
  "ITEM_NAME" VARCHAR2(255 BYTE)
)
;
COMMENT ON COLUMN "TEST"."PRIMARY_ID" IS '主键-';
COMMENT ON COLUMN "TEST"."CAPITAL" IS '价格';
COMMENT ON COLUMN "TEST"."ITEM_NAME" IS '项目';

## 插入数据
INSERT INTO "TEST" ("PRIMARY_ID", "CAPITAL", "ITEM_NAME") VALUES
 (21290151, '202412', 438048000);
INSERT INTO "TEST" ("PRIMARY_ID", "CAPITAL", "ITEM_NAME") VALUES
 (21290152, '202412', 4380480);
INSERT INTO "TEST" ("PRIMARY_ID", "CAPITAL", "ITEM_NAME") VALUES
 (21290153, '202412', 43804);

疑问点是什么

其实我的疑问很简单,就是为什么同样是NUMBER(10,3)类型的数据,在11G中无法插入到数据库,而在19C中是可以插入的。我也在网络上搜索了一下,并没有发现什么端倪。

Oracle 11g和19c中的NUMBER数据类型在核心功能和用途上保持一致,主要用于存储整数和小数,可以指定精度和小数位数。然而,在细节和特性上,两者可能存在一些差异,这些差异通常与数据库版本的整体改进和新特性相关,但具体针对NUMBER数据类型的直接变化并不显著。

数据类型NUMBER

【语法】

在oracle数据类型中,Oracle NUMBER数据类型用于存储可以是负数或正数的数值。NUMBER数据类型的语法如下:

NUMBER[(precision [, scale])]

【参数】

  • precision:精度是数字中的位数,它的范围从1到38。这也就是说,在Oracle中,NUMBER中数字的全部位数,包括整数位数部分和小数部分位数之和。我出现的问题时的理解就是在这里掉入坑里了。
  • scale:刻度是数字中小数点右侧的位数。它的范围从-84到127,当scale为0时,也可以写作为 NUMBER(p)

【举例说明】

为了更进一步验证我都想发,可以提前大胆的猜测下。例如,数字1234.56的精度为6,小数位数为2。因此,要存储这个数字,您需要NUMBER(6,2),这是反向的推测。下面可以提供一个参考:

尝试解决办法

在不知道如何处理时,先尝试增加整数部分的长度,例如我这里将NUMBER(10, 3) 改为 NUMBER(20, 3) ,希望能容纳更多更大的数据。

修改语句如下:

ALTER TABLE "IT"."TXXXX_INFO_I" MODIFY (XXXX_CAPITAL NUMBER(20, 3));

数据导入成功

更改后,数据可以正常插入到数据库中。成功截图如下:

总结

我写完这篇完全是懵懵的,希望抽空再来做一次测试验证,我还咩有弄清楚这个原因,只能先按照自己的想法来修改,先把数据存放进去。

[引用]

  1. 11g-Oracle Data-Types:https://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements001.htm#sthref118
  2. 19c-Oracle Data-Types:https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/Data-Types.html#GUID-9401BC04-81C4-4CD5-99E7-C5E25C83F608
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论