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://www.pswp.cn/pingmian/96334.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/96334.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端学习之后端java小白(二)-sql约束/建表

一、约束SQL约束(Constraints)是用于限制表中数据的规则,确保数据的完整性和准确性。以下是主要的SQL约束类型: 主要约束类型: 1. NOT NULL 约束: 确保列不能包含空值 CREATE TABLE users (id INT NOT NULL,name VARC…

OpenCV:图像金字塔

文章目录一、什么是图像金字塔?二、图像金字塔的核心操作:采样与逆采样1. 向下采样(pyrDown):从高分辨率到低分辨率步骤1:高斯滤波步骤2:删除偶数行与偶数列OpenCV实战代码效果特点2. 向上采样&…

LVS与Keepalived详解(一)负载均衡集群介绍

文章目录前言一、什么是LVS?二、四层(L4)负载均衡的最佳解决方案是什么?2.1解决方案分类与对比(负载均衡的三种方式介绍)2.1.1 硬件负载均衡 (Hardware Load Balancer)2.1.2 软件负载均衡 (Software Load B…

消息队列-kafka完结

基本概念和操作 基本概念 简单概念:::color4 Broker:如果将kafka比喻成数据仓库网络,那么Broker就是网络中的仓库节点,比如快递站,在该节点内可以独立运行,并且多个Broker可以连接起来,构建kafka集群Topic&…

Chromium 138 编译指南 Windows篇:环境变量配置与构建优化(三)

引言配置,往往决定成败。在软件开发的世界里,环境变量就像是一位无声的指挥家,默默地协调着各个组件的协同工作。对于Chromium 138这样一个拥有数千万行代码的超大型项目而言,正确的环境变量配置更是编译成功的关键所在。也许您曾…

LabVIEW加载 STL 模型至 3D 场景 源码见附件

LabVIEW 中 STL 模型的导入与 3D 场景显示,基于示例代码逻辑,结合格式兼容性、功能实现步骤及多样化显示方式,适用于三维可视化温控、机械零件模拟等场景。 1示例代码 NI 社区案例 “Add an STL file to 3D scene using LabVIEW” 提供了经…

硅基计划3.0 Map类Set类

文章目录一、二叉搜索树(排序树)1. 概念初识2. 模拟实现1. 创建搜索树节点2. 查找指定元素是否存在3. 插入4. 删除二、Map类1. put——设置单词以及其频次2. get——获取单词频次3. getOrDefault——获取单词频次或返回默认值4. remove——删除单词频次信…

LeetCode 刷题【73. 矩阵置零】

73. 矩阵置零 自己做 解&#xff1a;标记消除 class Solution { public:void setZeroes(vector<vector<int>>& matrix) {vector<bool> x(matrix.size(), false); //要置0的行vector<bool> y(matrix[0].size(), false); //…

Unity学习----【进阶】TextMeshPro学习(一)--基础知识点

来源于唐老狮的视频教学&#xff0c;仅作记录和感悟记录&#xff0c;方便日后复习或者查找 一.导入TextMeshPro 对于新创建的工程&#xff0c;可以直接在这里导入TMP必要的资源&#xff08;上面&#xff09;&#xff0c;以及TMP的实例和扩展&#xff08;下面&#xff09; 导入之…

BigDecimal(用于处理超出double范围的浮点数)

BigDecimal 是 Java 中 java.math 包提供的高精度十进制浮点数类&#xff0c;专为解决基本类型&#xff08;float/double&#xff09;的精度缺陷而设计&#xff0c;广泛用于金融、科学计算等对精度要求极高的场景。以下从核心特性、使用方法、常见问题对比、注意事项等方面详细…

Nginx 优化

文章目录1、隐藏版本号2、修改用户与组3、缓存时间4、日志切割5、连接超时6、更改进程数7、配置网页8、防盗链1、隐藏版本号 隐藏nginx的版本号&#xff0c;为了防止恶意用户利用已知漏洞进行攻击 ## 查看版本号 curl -I http://192.168.10.23方法一&#xff1a;修改配置文件…

基于多模态与主动学习的车船飞机图像识别系统研究与应用技术方案

技术方案 一、技术背景与研究现状 图像识别是计算机视觉的核心任务之一&#xff0c;随着深度学习的发展&#xff0c;基于 卷积神经网络&#xff08;CNN&#xff09; 与 视觉Transformer&#xff08;ViT&#xff09; 的图像分类方法已成为主流。 根据《图像分类技术选型——截止…

Word2Vec词嵌入技术和动态词嵌入技术

Word2Vec&#xff08;Word to Vector&#xff09;是 2013 年由 Google 团队提出的无监督词嵌入模型&#xff0c;是一种静态词嵌入技术&#xff0c;核心目标是将自然语言中的离散词汇映射为低维、稠密的实数向量&#xff08;即 “词向量”&#xff09;&#xff0c;让向量空间的距…

Netty从0到1系列之Netty逻辑架构【上】

文章目录一、Netty逻辑架构【上】1.1 网络通信层1.1.1 BootStrap & ServerBootStrap1. ✅核心方法链与配置2. ✅ 架构与流程3. ✅ 底层实现与原理分析4. ✅ 实践经验与总结1.1.2 Channel1.2 事件调度层1.2.1 事件调度层概述1.2.2 EventLoop【事件循环】1.2.3 EventLoopGrou…

Spring Cloud 高频面试题详解(含代码示例与深度解析)

文章目录Spring Cloud 高频面试题详解&#xff08;含代码示例与深度解析&#xff09;1. 什么是 Spring Cloud&#xff1f;它与 Spring Boot 有什么关系&#xff1f;2. 服务发现&#xff1a;Eureka 和 Nacos 的区别与选型&#xff1f;Eureka 示例与原理Eureka vs Nacos 对比表3.…

Ascend310B重构驱动run包

在Atlas 200I AI加速模块(Ascend310B)移植过程中如需要将自己编译的Image、dt.img及内核模块打包到启动镜像包中需要对"Ascend-hdk-310b-npu-driver-soc_<version>_linux-aarch64.run"(下面统称驱动run包)进行重构。下面将介绍如何重构run包。 重构驱动run包需…

Leecode hot100 - 287. 寻找重复数

题目描述 287. 寻找重复数 - 力扣&#xff08;LeetCode&#xff09; 定一个包含 n 1 个整数的数组 nums &#xff0c;其数字都在 [1, n] 范围内&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数 &#xff0c;返…

机器人控制器开发(驱动层——奥比大白相机适配)

文章总览 编译OrbbecSDK_ROS2的代码 执行命令 colcon buildros2 launch orbbec_camera dabai.launch.py问题1&#xff1a; 运行时报错&#xff1a; [component_container-1] [ERROR] [1757153916.450795107] [camera.camera_container]: Failed to load library: Could not…

`vcpkg` 微软开源的 C/C++ 包管理工具的使用和安装使用spdlog

vcpkg 是 微软开源的 C/C 包管理工具&#xff0c;类似于 Python 的 pip、Node.js 的 npm、Rust 的 cargo。 它的主要作用是&#xff1a;帮助你快速下载、编译、安装和管理 C/C 第三方库&#xff0c;并自动配置到你的项目&#xff08;比如 Visual Studio、CMake、MSBuild&#x…

Mysql 幻读详解

我们来详细地聊一聊 MySQL InnoDB 中的“幻读”&#xff08;Phantom Read&#xff09;问题。这是一个在数据库事务隔离中非常核心且有时令人困惑的概念。 我会从定义、例子、原因以及解决方案几个方面来彻底讲清楚。 1. 什么是幻读&#xff1f; 官方定义&#xff1a;幻读指的…