iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >oracle数值类型漫谈
  • 239
分享到

oracle数值类型漫谈

2024-04-02 19:04:59 239人浏览 八月长安
摘要

这片博客本来想的是只写pls_integer与number之间的性能比较,但是提笔之后我又想写更多我的思考过程,于是索性写一篇关于oracle数值类型的文章。干货太多,未免看得乏味,本篇我尝试用一种聊天谈话

这片博客本来想的是只写pls_integer与number之间的性能比较,但是提笔之后我又想写更多我的思考过程,于是索性写一篇关于oracle数值类型的文章。干货太多,未免看得乏味,本篇我尝试用一种聊天谈话的方式行文,希望同行者可以在一种轻松的氛围中和我一起来探讨oracle的诸多数值类型,好吧,那我就先抛砖引玉了。
1、number
我最先接触的数值类型就是老大哥number,它定义为number(p,s),p是精度,最大38位,s是刻度范围,可在-84~127间取值。举个栗子(例子):number(4,2),指的就是小数点整数+小数部分一共有4位,不包含小数点位,也就是说整数部分最多两位,如果小数部分多于2位,会做四舍五入处理(对于sqlserver和Mysql也会做四舍五入处理),如果小数部分不足2位的话,则会补0(对于sqlserver也会补0,但是mysql不会),如果不写p,s,那么就默认为38。number类型是oracle最常用的数字类型了,在很长一段时间之内,我以为数值类型就只有number,因为number类型足以处理几乎全部的数字类型了。但是之后在oracle道路上继续行走的过程中,我又认识了其他衍生的数值类型。
2、integer
其实最开始看到这个数值类型的时候,同很多人一样,我也认为它是number类型的子类型,最大38位,对于小数做自动四舍五入处理,但是后来我发现不完全是这样的。作为number的子类型不假,一般情况下,integer是作为存储整数值存在的,在需要存储整数值的时候我们会想到这个数值类型,但是它的最大位可不是38位,在插入的测试数值看到,它已经远远超过38位了,如图:
oracle数值类型漫谈
可以看到,对于integer只能存储38位的言论可谓是直接推翻。接下来我们来看坊间盛传的,"integer只能存储整数,对于小数会做四舍五入处理",来看一个例子:
create or replace procedure integer_test(a integer)
as 
b integer := a;
begin
  dbms_output.put_line(b);
end;
输出结果如图:
oracle数值类型漫谈
看到这个结果的时候,相信很多同学都已经凉了,简直是颠覆了以往的认识啊,的确,从这个例子可以看出,integer是number的子类型,但是它不会强制进行四舍五入处理,同时它最大位数大于38位。
3、int,numeric,decimal
这三种数值类型是oracle为了兼容其他数据库而存在的,同样都是number的子类型。在进行类型声明的时候,如果直接声明为int,numeric,decimal,它会被直接存为integer,处理方式同integer一模一样;numeric和decimal如果带有精度和刻度范围,那么会被存为number(p,s),处理方式同number(p,s),int类型只能被声明为int,不能带精度和刻度范围,所以只能当作integer来处理。
4、float
float也是number的子类型,float(n),n指的是精度,是二进制精度,这里可不是十进制精度哦,计算公式为:binary precision=ceil(b*0.30103),float没有刻度范围.n的范围为1~126。那么怎么计算存入数据库中的数值呢,比如:float(2),那么它的精度是ceil(2*0.30103)=1,如果存入13.5,那么应该是1.35*10^1,精度为1,1.35四舍五入变为1,所以就是1*10^1=10存入的结果就是10;如果是19.5,那么应该是1.95*10^1,精度为1,1.95四舍五入为2,就是2*10^1,结果存入20。如果没有精度,那么映射为number类型,直接存入此值。oracle没有直接为double类型的数值类型。
5、binary_integer和pls_integer
这个数字类型只能用于PL/SQL,他们相比number来说更具优势,首先是占有较少的存储空间,其次他们是直接通过硬件来计算的,也就是直接通过CPU进行计算,而不用经过转换,number类型在计算的时候,还要先被转换为二进制,所以在计算速度上,binary_integer和pls_integer比number性能好很多,建议在PL/SQL中使用这两种数据类型来代替number,你将会得到很大的惊喜。
5、binary_float和binary_double
这两种数值类型10g之后才出现,binary_float可以存储一个单精度的32位浮点数,binary_double可以存储一个双精度的64位浮点数,binary_float和binary_double占有更少的存储空间,同样的,binary_float和binary_double也是直接通过硬件计算的,所以它的计算效率更高,而且它们比起number来说可以存储更大或者更小的数值,但是这两种数值类型也会存在精度不准的情况。
6、写到浮点型,我需要说一说浮点型存数不精确的原因:
首先,我们要知道浮点型在计算机是怎么存储的,比如:要存入13.75,首先将整数部分转为二进制,13转为二进制是1101,接下来将小数部分转为二进制,小数部分是0.75,将小数部分乘以2,取结果的整数部分为二进制的一位,然后继续取结果的小数部分乘以2重复,一直到小数部分全部为0结束,在这个过程中,是会出现循环乘不尽的情况,但是因为浮点数的小数位是确定的(float是23位,double是52位),所以到了指定的小数位就会停下来,这就是浮点数存数不精确的原因,可以看到如果可以在小数位范围之内乘尽的话,那么结果就存储的准确了。来看看小数部分(0.75)转为二进制的过程:
0.75*2=1.5   取1
0.5*2=1     取1
乘到这里,即0.5*2=1,1已经没有小数部分了,所以到这里也就停止了,最后的结果是0.11,与上面整数部分合起来,那么13.75转换为二进制为1101.11,即1.10111*2^3,1.10111是小数部分,2为底,6为指数部分,这个1.10111*2^3就是转换好的二进制浮点数,接着就是将这个二进制浮点数存入计算机了。
将其存入计算机内,将会使用浮点表示法,分为三大部分:
第一部分:符号位,占用1位,用来区分正负数,0为正数,1为负数;对于1.10111*2^3,它是正数,所以符号位是0
第二部分:指数位,float占用8位,double占用11位,用来表示指数;对于1.10111*2^3,指数位是3
第三部分:小数位,float占用23位,double占用52位,用来表示小数,不足位数补0;对于1.10111*2^3,小数位是10111
所以对于float,符号位+指数位+小数位=1+8+23=32位,对于double,符号位+指数位+小数位=64位,同时可以看到,指数位决定了大小范围,小数位决定了精度。因为指数位有可能是正数,也有可能是负数,负数算起来比正数麻烦,所以为了减少计算的麻烦,在存储指数的时候,需要将它存储位无符号的整数,所以在指数位上会加一个偏移量,float的偏移量是127,double的偏移量是1023,如果需要转换为十进制的话,到时候指数减去相应的值就可以了。那么对于13.75(float),本来它的二进制指数值是3,现在就成了3+127=130,转换为二进制是10000010,最终:13.75(float)被存储为:符号位 指数位 小数位(不足位补0)=0 10000010 10111 00000 00000 00000 000
7、万丈高楼平地起,有时候我们太过追求一些高级语法,或者高大尚的东西,反而在基础的东西上掌握不牢,实际上,数据库的基础数据类型往往没有表面上看的那么简单,其实任何语言都是一样,只有掌握好基础知识,做一个基础精通者,那么,在我们进阶的道路上就会水到渠成。写到最后,才发现整体下来,整篇文章也没有那么轻松,严肃的东西写惯了,一下子不太适应写轻松的东西,没事,能抛砖引玉就好。
oracle数值类型漫谈
您可能感兴趣的文档:

--结束END--

本文标题: oracle数值类型漫谈

本文链接: https://www.lsjlt.com/news/47147.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 浅谈Redis存储数据类型及存取值方法
    Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合) String存取值: 是 redi...
    99+
    2024-04-02
  • Python数据类型 -数值类型(整数,
    一、整数:1)整型(Int) - 通常被称为是整型或整数,是正或负整数,不带小数点。Python3 整型是没有限制大小的,可以当作 Long 类型使用,所以 Python3 没有 Python2 的 Long 类型。如:num01 =100...
    99+
    2023-01-31
    整数 数值 数据类型
  • Python数值类型
    数值类型 python的数值类型包括常规的类型:整数(没有小数部分的数字)、浮点数(通俗地说,就是有小数部分的数字)以及其它数值类型(复数、分数、有理数、无理数、集合、进制数等)。除了十进制整数,还有二进制数、八进制数、十六进制数。 ...
    99+
    2023-01-30
    数值 类型 Python
  • Python--数值类型
    Python数值类型 变量-变量是内存中的一块区域。变量的命名:变量由字母,数字,下划线组成。python中地址变量与c语言刚好相反,一条数据包含包含多个标签;  1、Input与raw_input区别Print + 字符串Input + ...
    99+
    2023-01-31
    数值 类型 Python
  • 详细谈谈ES6中的symbol数据类型
    目录symbol数据类型symbol出现的原因Symbol特点symbol的应用在rb对象中添加up和down方法Symbol内置的属性值总结symbol数据类型 js语言中,ES...
    99+
    2024-04-02
  • oracle中decimal类型怎么赋值
    在Oracle中,DECIMAL类型通常是指NUMBER类型,可以采用以下方式对DECIMAL类型赋值: 使用数字直接赋值: D...
    99+
    2024-04-09
    oracle
  • oracle中boolean类型怎么赋值
    在Oracle数据库中,并没有原生的boolean数据类型,通常使用数字或者字符类型来表示布尔值。常见的做法是使用NUMBER类型,...
    99+
    2024-03-02
    oracle
  • golang 数值类型转换
    随着Golang的流行,越来越多的开发者开始学习和使用Golang编程语言。在Golang中,数字类型转换是一个常见的问题。本篇文章将讨论如何在Golang中进行数值类型的转换。第一部分:Golang中的数值类型在Golang中,有不同类型...
    99+
    2023-05-14
  • 浅谈golang通道类型
    目录一、什么是通道类型二、通道产生的原因三、声明channel四、创建channel五、channel相关操作1、发送值2、接收值3、关闭通道六、通道类型1、无缓冲通道2、有缓冲通道...
    99+
    2023-02-14
    golang 通道类型 golang 通道
  • 浅谈python数据类型及其操作
    目录一、Number 数字二、String 字符串三、List 列表四、Tuple 元组五、Sets集合六、Dictionary 字典 (非常重要)一、Number 数字 1.内置...
    99+
    2024-04-02
  • C++ 函数返回值类型的常见类型
    c++++ 函数返回类型包括:void(无返回值)、基本类型(整数、浮点数、字符和布尔值)、指针、引用、类和结构。选择时,应考虑功能、效率和接口。如计算阶乘的 factorial 函数,...
    99+
    2024-04-12
    函数 返回值 c++
  • python基础之数值类型
    python基础之数值类型 python3中共有11种基本数据类型,而这11种基本数据类型又通常分成3类,即 数值类型:int (整形)float(浮点型) bool(布尔) complex(复数) 序列类型:string(字符串) l...
    99+
    2023-01-30
    数值 类型 基础
  • 浅谈String类型如何转换为time类型存进数据库
    目录String转换为time存进数据库这里就列举一个例子java里面的类型是string类型我用的是java提供的传统的jdbc接口连接数据库String类型的数字转换为时间日期格...
    99+
    2024-04-02
  • 使用String类型小数值转换为Long类型
    目录String类型小数值转为Long类型解决方案如下String类型转int,转long转int转longString类型小数值转为Long类型 数值分为小数和整数,当传入的类型为...
    99+
    2024-04-02
  • 无法对类型参数值使用类型断言
    在PHP编程中,类型断言是一种常用的技术,用于确定变量的类型。然而,有时候我们可能会遇到一个问题:无法对类型参数值使用类型断言。这个问题可能让一些开发者感到困惑。在本文中,我们将探讨这...
    99+
    2024-02-09
  • JavaScript数据类型转换实例(其他类型转字符串、数值型、布尔类型)
    前言  什么是数据类型转换? 使用表单、prompt 获取过来的数据默认类型是字符串类型的,此时就不能直接进行加减法运算,而需要转换变量的数据类型。 通俗来说,数据类型转...
    99+
    2024-04-02
  • MySQL中有哪些数值类型
    今天就跟大家聊聊有关MySQL中有哪些数值类型,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。数值类型 MySQL 的数值数据类型可以大致划...
    99+
    2024-04-02
  • javascript中有哪些数值类型
    本篇内容主要讲解“javascript中有哪些数值类型”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“javascript中有哪些数值类型”吧! ...
    99+
    2024-04-02
  • python数值类型有哪几种
    Python的数值类型有以下几种:1. 整数类型(int):表示整数,例如1、-5、100等。2. 浮点数类型(float):表示带...
    99+
    2023-10-08
    python
  • MySQL 数值类型溢出处理
    推荐阅读:吊打面试官!MySQL灵魂100问,你能答出多少?来,考考大家一个问题,在 MySQL 中当某一列设置为 int(0) 时会发生什么 ?为了演示这个问题,我们先要创建一个表 DROP TABLE IF EXISTS `na...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作