上一篇文章我们唠叨了浮点数,知道了浮点数存储小数是不精确的。本篇继续唠叨一下MySQL中的另一种存储小数的方式 —— 定点数。浮点数文章闪现:

  • 什么, 0.3 - 0.2 ≠ 0.1 ? 什么鬼

定点数类型

正因为用浮点数表示小数可能会有不精确的情况,在一些情况下我们必须保证小数是精确的,所以设计MySQL的大叔们提出一种称之为定点数的数据类型,它也是存储小数的一种方式:

其中:

  • M表示该小数最多需要的十进制有效数字个数。

    注意是有效数字个数,比方说对于小数-2.3来说有效数字个数就是2,对于小数0.9来说有效数字个数就是1

  • D表示该小数的小数点后的十进制数字个数。

    这个好理解,小数点后有几个十进制数字,D的值就是什么。

举个例子看一下,设置了MD的单精度浮点数的取值范围的变化:

类型 取值范围
DECIMAL(4, 1) -999.9~999.9
DECIMAL(5, 1) -9999.9~9999.9
DECIMAL(6, 1) -99999.9~99999.9
DECIMAL(4, 0) -9999~9999
DECIMAL(4, 1) -999.9~999.9
DECIMAL(4, 2) -99.99~99.99

可以看到,在D相同的情况下,M越大,该类型的取值范围越大;在M相同的情况下,D越大,该类型的取值范围越小。当然,MD的取值也不是无限大的,M的取值范围是1~255D的取值范围是0~30,而且D的值必须不大于MMD都是可选的,如果我们省略了它们,那它们的值按照机器支持的最大值来存储。

我们说定点数是一种精确的小数,为了达到精确的目的我们就不能把它转换成二进制小数之后再存储(因为有很多十进制小数转为二进制小数后需要进行舍入操作,导致二进制小数表示的数值是不精确的)。其实转念一想,所谓的小数只是把两个十进制整数用小数点分割开来而已,我们只要把小数点左右的两个十进制整数给存储起来,那不就是精确的了么。比方说对于十进制小数2.38来说,我们可以把这个小数的小数点左右的两个整数,也就是238分别保存起来,那么不就相当于保存了一个精确的小数么,这波操作是不是很6。

当然事情并没有这么简单,对于给定MD值的DECIMAL(M, D)类型,比如DEMCIMAL(16, 4)来说:

  • 首先确定小数点左边的整数最多需要存储的十进制位数是12位,小数点右边的整数需要存储的十进制位数是4位,如图所示:


  • 从小数点位置出发,每个整数每隔9个十进制位划分为1组,效果就是这样:


    从图中可以看出,如果不足9个十进制位,也会被划分成一组。

  • 针对每个组中的十进制数字,将其转换为二进制数字进行存储,根据组中包含的十进制数字位数不同,所需的存储空间大小也不同,具体见下表:

    组中包含的十进制位数 占用存储空间大小(单位:字节)
    1或2 1
    3或4 2
    5或6 3
    7或8或9 4

    所以DECIMAL(16, 4)共需要占用8个字节的存储空间大小,这8个字节由下边3个部分组成:

    • 第1组包含3个十进制位,需要使用2个字节存储。

    • 第2组包含9个十进制位,需要使用4个字节存储。

    • 第3组包含4个十进制位,需要使用2个字节存储。

  • 将转换完成的比特位序列的最高位设置为1。

这些步骤看的有一丢丢懵逼吧,别着急,举个例子就都清楚了。比方说我们使用定点数类型DECIMAL(16, 4)来存储十进制小数1234567890.1234,这个小数会被划分成3个部分:

1 234567890 1234

也就是:

  • 第1组中包含整数1

  • 第2组中包含整数234567890

  • 第3组中包含整数1234

然后将每一组中的十进制数字转换成对应的二进制数字:

  • 第1组占用2个字节,整数1对应的二进制数就是(字节之间实际上没有空格,只不过为了大家理解上的方便我们加了一个空格):

    00000000 00000001

    二进制看起来太难受,我们还是转换成对应的十六进制看一下:

    0x0001
  • 第2组占用4个字节,整数234567890对应的十六进制数就是:

    0x0DFB38D2
  • 第3组占用2个字节,整数1234对应的十六进制数就是:

    0x04D2

所以将这些十六进制数字连起来之后就是:

0x00010DFB38D204D2

最后还要将这个结果的最高位设置为1,所以最终十进制小数1234567890.1234使用定点数类型DECIMAL(16, 4)存储时共占用8个字节,具体内容为:

0x80010DFB38D204D2

有的同学会问,如果我们想使用定点数类型DECIMAL(16, 4)存储一个负数怎么办,比方说-1234567890.1234,这时只需要将0x80010DFB38D204D2中的每一个比特位都执行一个取反操作就好,也就是得到下边这个结果:

0x7FFEF204C72DFB2D

从上边的叙述中我们可以知道,对于DECIMAL(M, D)类型来说,给定的MD的值不同,所需的存储空间大小也不同。可以看到,与浮点数相比,定点数需要更多的空间来存储数据,所以如果不是在某些需要存储精确小数的场景下,一般的小数用浮点数表示就足够了。

对于定点数类型DECIMAL(M, D)来说,MD都是可选的,默认的M的值是10,默认的D的值是0,也就是说下列等式是成立的:

DECIMAL = DECIMAL(10) = DECIMAL(10, 0)DECIMAL(n) = DECIMAL(n, 0)

另外M的范围是1~65D的范围是0~30,且D的值不能超过M

mysql中的生日应该是什么类型_MySQL中的定点数类型相关推荐

  1. mysql 属于定点数的类型_MySQL浮点数和定点数类型

    MySQL中,存储小数使用的浮点数和定点数类型. 浮点数有两种,单精度浮点类型--FLOAT,双精度浮点数类型--DOUBLE. 定点数只有DECIMAL类型. FLOAT 占用:4字节 有符号:-3 ...

  2. mysql数据库中的int类型_MySQL中int(M)和tinyint(M)数值类型中M值的意义

    在一开始接触MySQL数据库时,对于int(M)及tinyint(M)两者数值类型后面的M值理解是最多能够插入数据库中的值不能大于M: 后来工作后,也是一边学习一边使用,之后的理解是其中的M的意思是插 ...

  3. 数组在mysql中是什么类型_MySQL 中的数据类型介绍

    1.概述 要了解一个数据库,我们也必须了解其支持的数据类型. MySQL支持所有标准的SQL数据类型,主要分3类: 数值类型 字符串类型 时间日期类型 另一类是几何数据类型,用的不多,也没多介绍.  ...

  4. created at mysql类型_mysql中Invalid default value for 'created_at'问题汗血宝马

    环境 mac + mysql 问题 在创建表的时候遇到了Invalid default value for 'created_at'的错误,不知道什么原因造成的. CREATE TABLE `test ...

  5. mysql日期和时间类型_MySQL日期和时间类型

    MySQL中存储日和和时间,使用日期和时间类型. 提供的包括YEAR.DATE.TIME.DATETIME和TIMESTAMP. YEAR 占用:1字节 取值范围:1901~2155 日期格式:YYY ...

  6. mysql的本地id可以随便设置马_MySQL中的账号与权限管理

    MySQL权限管理 权限系统的工作原理 MySQL权限系统通过下面两个阶段进行认证: (1)对连接的用户进行身份认证,合法的用户通过认证.不合法的用户拒绝连接. (2)对通过认证的合法用户赋予相应的权 ...

  7. mysql几种索引类型_Mysql几种索引类型的区别及适用情况

    如大家所知道的,Mysql目前主要有以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE. 那么,这几种索引有什么功能和性能上的不同呢? FULLTEXT 即为全文索引,目前只有MyI ...

  8. mysql增加字段类型_mysql 增加修改字段类型及删除字段类型

    MySQL添加字段: alter table `user_movement_log` Add column GatewayId int not null default 0 AFTER `Region ...

  9. mysql中所有时间类型_MySQL 中的日期时间类型

    INSERT INTO todo (title,created_on) VALUES ('blah','2019-09-31'); ERROR 1292 (22007): Incorrect date ...

最新文章

  1. 魔改Attention大集合
  2. 【转】奴性哲学十句话,洗脑常用词!!!
  3. 拖动无标题栏的窗体,需要处理的三个事件
  4. Effective C++ --6 继承与面向对象设计
  5. 设计需要冲击力:「不怕没品味的人,就怕没品味的人用心」
  6. GO To Definition的背后操作【VS2015 C#】
  7. MyEclipse下Tomcat启动变慢的解决方法
  8. ClickHouse 副本协同原理:ReplicatedMergeTree引擎
  9. python分布式爬虫系统_三种分布式爬虫系统的架构方式
  10. ajax json 403,解决 Ajax 发送 post 请求出现 403 Forbidden 的三种方式
  11. InfoPath中的Rich Text Box中如何加“回车”
  12. 理解卷积神经网络的利器:9篇重要的深度学习论文(上)
  13. JEECG分页条数自定义
  14. pytorch dataloader_基于pytorch的DeepLearning入门流程
  15. macos catalina cdr下载_这个开源神器可快速帮你安装 MacOS 虚拟机
  16. EasyDarwin接口的使用——使用C++编写客户端实现与EasyDarwin服务器的交互
  17. C语言中格式输出二进制的两种方法
  18. Mixpanel获Andreessen Horowitz投资 为Viddy及Path提供分析服务
  19. 键盘输入盲打训练, 打字练习,打字游戏 打字教程推荐
  20. Qt编程(一) Qt框架简介

热门文章

  1. 核弹级漏洞 Apache Log4j2 漏洞详情和修复建议
  2. 系统架构设计师 - 软件架构设计 - 架构评估
  3. mysql 取最后一次登陆,获得最后一次插入mysql的id | 学步园
  4. websocket 获取连接id_Swoole学习笔记七:搭建WebSocket长连接 之 使用 USER_ID 作为身份凭证...
  5. qt中根据数据解析的结果动态的创建控件并布局
  6. Python callable 函数 - Python零基础入门教程
  7. Pycharm 提示:this license * has been cancelled - Python零基础入门教程
  8. matlab中多边形滤波器,几种常见空间滤波器MATLAB实现
  9. matlab数字图像处理函数,MATLAB数字图像处理学习(二)|常用函数
  10. mysql里面可以用正则吗_Mysql中使用正则表达式