当前位置: 首页 > news >正文

oracle里的int类型

oracle里的int类型

在 ANSI SQL 标准 中,INTEGER 和 SMALLINT 是定义好的精确数值类型,但它们的 “长度”或“大小”并不是通过 (N) 括号来指定的(如 INT(4)),这一点与 MySQL 等数据库的非标准扩展完全不同。

  1. SMALLINT
    语义:短整型整数
    实际实现:通常是 16 位有符号整数,2个字节
    取值范围:-32,768 ≤ SMALLINT ≤ 32,767
  2. INTEGER 或 INT
    语义:标准整数
    实际实现:通常是 32 位有符号整数,4个字节
    取值范围:-2,147,483,648 ≤ INTEGER ≤ 2,147,483,647

oracle没有内置int类型,但是兼容int类型,在oracle里int和smallint认为是number(38),元信息是这样的,但数据受约束不一样,number(38)受38位有效数字限制,而int只受number类型的最大限制限制,即NUMBER [ (p [, s]) ],Number having precision p and scale s. The precision p can range from 1 to 38. The scale s can range from -84 to 127. Both precision and scale are in decimal digits. A NUMBER value requires from 1 to 22 bytes.
所以在oracle中的int类型约束等同于number类型,但元信息为number(38),其实际存储数据的限制会远大于sql标准中的int和smallint

Data Types

ANSI SQL Data TypeOracle Data Type
CHARACTER(n)
CHAR(n)
CHAR(n)
CHARACTER VARYING(n)
CHAR VARYING(n)
VARCHAR2(n)
NATIONAL CHARACTER(n)
NATIONAL CHAR(n)
NCHAR(n)
NCHAR(n)
NATIONAL CHARACTER VARYING(n)
NATIONAL CHAR VARYING(n)
NCHAR VARYING(n)
NVARCHAR2(n)
NUMERIC[(p,s)]
DECIMAL[(p,s)] (Note 1)
NUMBER(p,s)
INTEGER
INT
SMALLINT
NUMBER(38)
FLOAT (Note 2)
DOUBLE PRECISION (Note 3)
REAL (Note 4)
FLOAT(126)
FLOAT(126)
FLOAT(63)

以下测试版本:oracle 19.18.0.0.0
SQL> create table t1(c1 int,c2 smallint);Table created.SQL> desc t1Name                                                              Null?    Type----------------------------------------------------------------- -------- --------------------------------------------C1                                                                         NUMBER(38)C2                                                                         NUMBER(38) --但是建表时,不支持int(4)这种限制类型长度,也不支持int4这种写法
SQL> create table t2(id int(4));
create table t2(id int(4))*
ERROR at line 1:
ORA-00907: missing right parenthesisSQL> create table t2(id int4);
create table t2(id int4)*
ERROR at line 1:
ORA-00902: invalid datatype--int类型与number(38)长度的不同
SQL> create table t1(c1 number(38));Table created.
SQL> desc t1Name                                                              Null?    Type----------------------------------------------------------------- -------- --------------------------------------------C1                                                                         NUMBER(38)SQL> insert into t1 values (99999999999999999999999999999999999999);  --38个91 row created.SQL> insert into t1 values (999999999999999999999999999999999999999);  --39个9
insert into t1 values (999999999999999999999999999999999999999)*
ERROR at line 1:
ORA-01438: value larger than specified precision allowed for this columnSQL> select c1,to_char(c1),length(c1) from t1;C1 TO_CHAR(C1)                                                                      LENGTH(C1)
---------- -------------------------------------------------------------------------------- ----------
1.0000E+38 99999999999999999999999999999999999999                                                   38SQL> create table t3(c1 int);Table created.
SQL> desc t3Name                                                              Null?    Type----------------------------------------------------------------- -------- --------------------------------------------C1                                                                         NUMBER(38)SQL> insert into t3 values (99999999999999999999999999999999999999);  --38个91 row created.SQL> insert into t3 values (999999999999999999999999999999999999999);  --39个91 row created.SQL> insert into t3 values (99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999);  --125个91 row created.
SQL> insert into t3 values (999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999);   --126个9
insert into t3 values (999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999)*
ERROR at line 1:
ORA-01426: numeric overflowSQL>  select c1,to_char(c1),length(c1) from t3;C1 TO_CHAR(C1)                                                                      LENGTH(C1)
---------- -------------------------------------------------------------------------------- ----------
1.0000E+38 99999999999999999999999999999999999999                                                   38
1.0000E+39 999999999999999999999999999999999999999                                                  39
1.000E+125 1.000000000000000000000000000000000E+125                                                 40--没有长度的number类型
SQL> create table t2(c1 number);Table created.SQL> desc t2Name                                                              Null?    Type----------------------------------------------------------------- -------- --------------------------------------------C1                                                                         NUMBERSQL> insert into t2 values (99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999);1 row created.SQL> insert into t2 values (999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999);
insert into t2 values (999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999)*
ERROR at line 1:
ORA-01426: numeric overflow

但是oracle在plsql对int类型的用法与在sql中有所区别,在plsql中可以使用int或者int(1) 写法,且要做精度检查,其中int等于number(38),int(1)等于number(1)

SQL> -- 开启输出
SET SERVEROUTPUT ON;SQL>--int(1)
SQL> DECLAREv1  INT(1);
BEGINv1 := 1;DBMS_OUTPUT.PUT_LINE('v1=' || v1);
END;
/  2    3    4    5    6    7
v1=1PL/SQL procedure successfully completed.SQL> DECLAREv1  INT(1);
BEGINv1 := 11;DBMS_OUTPUT.PUT_LINE('v1=' || v1);
END;
/  2    3    4    5    6    7
DECLARE
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: number precision too large
ORA-06512: at line 4----int
SQL> DECLAREv1  INT;
BEGINv1 := 99999999999999999999999999999999999999;  --38个9DBMS_OUTPUT.PUT_LINE('v1=' || v1);
END;
/  2    3    4    5    6    7
v1=99999999999999999999999999999999999999PL/SQL procedure successfully completed.SQL> DECLAREv1  INT;
BEGINv1 := 999999999999999999999999999999999999999;  --39个9DBMS_OUTPUT.PUT_LINE('v1=' || v1);
END;
/2    3    4    5    6    7  DECLARE
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: number precision too large
ORA-06512: at line 4

所以,在oracle里,在sql里int类型不做精度检查,存储限制上等同于number,元信息上为number(38),在plsql里,要做精度检查,int完全等同于number(38),int(1)等同于number(1)
因此在oracle开发规范中,还是尽量使用number类型,避免使用int类型,不过如果是其他支持标准 int类型的数据库中,如果数据符合int类型特点,还是建议用int类型而非numeric类型,因为int类型是定长存储,一般性能会更好


文章转载自:

http://TCO4JSvP.khtyz.cn
http://Jq6K2CcL.khtyz.cn
http://Dfs2fKv5.khtyz.cn
http://9DwBpIhi.khtyz.cn
http://7upa2OAT.khtyz.cn
http://6cEgbBNi.khtyz.cn
http://2TKOPtPf.khtyz.cn
http://dvGhtCov.khtyz.cn
http://U9Us1O3G.khtyz.cn
http://EwOOHUEp.khtyz.cn
http://bcGZ6YbK.khtyz.cn
http://YAPentrQ.khtyz.cn
http://za2kcuyU.khtyz.cn
http://ZwNrihec.khtyz.cn
http://dCKPVG5P.khtyz.cn
http://yhxMt56C.khtyz.cn
http://6SwA2JUT.khtyz.cn
http://0By7hrKe.khtyz.cn
http://Y3svSFXL.khtyz.cn
http://goVVZdzJ.khtyz.cn
http://deHzG39U.khtyz.cn
http://yxt7OPOS.khtyz.cn
http://EBveBy62.khtyz.cn
http://yrO1Hyeu.khtyz.cn
http://cFnyT1qY.khtyz.cn
http://s5vSrgvL.khtyz.cn
http://gmi16Oo6.khtyz.cn
http://ZfJKWAf5.khtyz.cn
http://LApVXCCd.khtyz.cn
http://PiGrVESg.khtyz.cn
http://www.dtcms.com/a/379447.html

相关文章:

  • 【开关电源篇】整流及其滤波电路的工作原理和设计指南-超简单解读
  • 第五章 Logstash深入指南
  • 猫狗识别算法在智能喂食器上的应用
  • 数据库事务详解
  • Linux学习:基于环形队列的生产者消费者模型
  • size()和length()的区别
  • Windows系统下安装Dify
  • 企业云环境未授权访问漏洞 - 安全加固笔记
  • sv时钟块中default input output以及@(cb)用法总结
  • 广谱破局!芦康沙妥珠单抗覆罕见突变,一解“少数派”的用药困境
  • Guli Mall 25/08/12(高级上部分)
  • 彩笔运维勇闯机器学习--随机森林
  • Python 面向对象实战:私有属性与公有属性的最佳实践——用线段类举例
  • 使用deboor法计算三次B样条曲线在参数为u处的位置的方法介绍
  • 认识HertzBeat的第一天
  • AUTOSAR进阶图解==>AUTOSAR_EXP_ApplicationLevelErrorHandling
  • 线程同步:条件变量实战指南
  • OpenLayers数据源集成 -- 章节七:高德地图集成详解
  • AI助推下半年旺季,阿里国际站9月采购节超预期爆发
  • 电商平台拍立淘API接口调用全解析(基于淘宝/唯品会技术实践)
  • 9.11 Qt
  • 字节一面 面经(补充版)
  • 第二章 ELK安装部署与环境配置
  • I2C 总线
  • 设计模式——七大常见设计原则
  • 请创建一个视觉精美、交互流畅的进阶版贪吃蛇游戏
  • 利用美团龙猫添加xlsx的sheet.xml读取sharedStrings.xml中共享字符串输出到csv功能
  • 时序数据库:定义与基本特点
  • 【WorkManager】Android 后台任务调度的核心组件指南
  • python项目批量安装包和生成requirements.txt文件