Oracle的number数据类型
原文地址:https://www.cnblogs.com/andrew3/p/13199265.html
https://www.cnblogs.com/oumyye/p/4448656.html
NUMBER ( precision, scale)
- precision表示数字中的有效位;如果没有指定precision的话,Oracle将使用38作为精度。
- 如果scale大于零,表示数字精确到小数点右边的位数;scale默认设置为0;如果scale小于零,Oracle将把该数字取舍到小数点左边的指定位数。
- Precision的取值范围为 [1---38];Scale的取值范围为 [-84---127]。
- NUMBER整数部分允许的长度为(precision- scale),无论scale是正数还是负数。
- 如果precision小于scale,表示存储的是没有整数的小数。
- Precision表示有效位数,有效数位:从左边第一个不为0的数算起,小数点和负号不计入有效位数;scale表示精确到多少位,指精确到小数点左边或右边多少位(+-决定)。
- NUMBER类型数值举例
实际数值 | 数据类型 | 存储值 |
1234567.89 | number | 1234567.89 |
1234567.89 | number(8) | 1234567 |
1234567.89 | number(6) | 出错 |
1234567.89 | number(9,1) | 1234567.9 |
1234567.89 | number(9,3) | 出错 |
1234567.89 | number(7,2) | 出错 |
1234567.89 | number(5,-2) | 1234600 |
1234511.89 | number(5,-2) | 1234500 |
1234567.89 | number(5,-4) | 1230000 |
1234567.89 | number(*,1) | 1234567.9 |
0.012 | number(2,3) | 0.012 |
0.23 | number(2,3) | 出错 |
8. 关于precision, scale也可以作如下表述
定点数的精度(p)和刻度(s)遵循以下规则:
1) 当一个数的整数部分的长度 > p-s 时,Oracle就会报错
2) 当一个数的小数部分的长度 > s 时,Oracle就会舍入。
3) 当s(scale)为负数时,Oracle就对小数点左边的s个数字进行舍入。
4) 当s > p 时, p表示小数点后第s位向左最多可以有多少位数字,如果大于p则Oracle报错,小数点后s位向右的数字被舍入
与int的区别
oracle本来就没有int类型,为了与别的数据库兼容,新增了int类型作为number类型的子集。
int类型只能存储整数;
number可以存储浮点数,也可以存储整数;
number(8,1)存储小数位为1位,总长度为8的浮点数,如果小数位数不足,则用0补全;
number(8)存储总长度为8的整数;
int相当于number(22),存储总长度为22的整数。
NUMBER类型的子类
a) oracle本来就没有int类型,为了与别的数据库兼容,新增了int类型作为number类型的子集。
b) int类型只能存储整数;number可以存储浮点数,也可以存储整数。
c) 在oracle数据库建表的时候,decimal,numeric不带精度,oracle会自动把它处理成INTEGER;带精度,oracle会自动把它处理成number。
d) Oracle只用NUMBER(m,n)就可以表示任何复杂的数字数据。
e) decimal,numeric,int等都为SQL、DB2等数据库的数据类型,ORACLE为了兼容才将其引入;但实际上在ORACLE内部还是以NUMBER的形式将其存入。
NUMBER设置主键自增
不同于mysql可以直接设置自增,需要建立序列,和触发器。例:
先建张表
然后,自定义一个序列(sequence)
CREATE SEQUENCE test_sequence INCREMENT BY 1 -- 每次加几个 START WITH 1 -- 从1开始计数 NOMAXVALUE -- 不设置最大值 NOCYCLE -- 一直累加,不循环 NOCACHE -- 不建缓冲区
再创建一个触发器
CREATE OR REPLACE TRIGGER test_trigger BEFORE INSERT ON test FOR EACH ROW BEGIN SELECT test_sequence.nextval INTO :new.id FROM dual; END;
插入数据进行测试
结果是这样,即使你在插入的时候指定了id的值,但实际id还是自增后的值,我的版本是11g,不知道人家的博客为什么结果都是手动指定的id值???
相关文章
- c++ Oracle OCCI 编程
- C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志
- Oracle数据库:oracle执行计划性能代价cost,全表扫描速度慢,索引扫描速度快
- Oracle数据库:oracle嵌套分组函数(聚合函数),组函数的练习题,挺复杂的,用好decode函数,很有趣
- Oracle数据库:oracle内连接inner join on,多表查询各种自链接、内连接、外连接的练习示例
- Oracle数据库:oracle函数嵌套,nvl函数,nvl2函数,nullif函数,coalesce合并函数
- Oracle数据库:oracle函数,单行函数,多行函数,upper,lower,initcap,字符串函数
- Oracle ASM 翻译系列第六弹:高级知识 如何映射asmlib管理的盘到它对应的设备名
- Oracle ASM 翻译系列第二十二弹:ASM Internal ASM file number 8
- Oracle数据库备份恢复的概念:错误类型、实例恢复方法等
- oracle分区表备份恢复
- oracle 启动监听报错TNS-12547: TNS:lost contact
- 从Oracle迁移到Mysql之前必须知道的50件事
- oracle中int类型和number类型区别
- 《Oracle SQL疑难解析》——1.9 从表中删除不需要的行
- 《Oracle SQL疑难解析》——1.15 启用其他排序和比较选项
- oracle函数 TO_NUMBER(X[[,c2],c3])
- Oracle中rownum和row_number()
- ORACLE V$lock视图TYPE,ID1,ID2取值的含义
- [Oracle 工程师手记] Windows 环境下,获取与 oracle 相关 registry 的小技巧
- [Oracle工程师手记] 通过 lsof 命令查找oracle client 端和 server 端进程
- Oracle 11gR2光钎链路切换crs服务发生crash
- 【从翻译mos文章】在oracle db 11gR2版本号被启用 Oracle NUMA 支持
- Oracle 基础系列之1.2 oracle的基本使用
- Mybatis+Oracle搭配insert空值报错之myBatis+mysql驱动+oracle驱动的源码分析