DECIMAL和NUMERIC

MySQL支持两种定点数类型:DECIMAL和NUMERIC,而NUMERIC实现为DECIMAL,因此MySQL中DECIMAL和NUMERIC等价相同。

如使用下面建表语句:

CREATE TABLE tb003(
id INT PRIMARY KEY,
c1 DECIMAL(20,5),
c2 NUMERIC(18,5)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

表创建完成后显示的建表语句:

CREATE TABLE `tb003` (
`id` INT(11) NOT NULL,
`c1` DECIMAL(20,5) DEFAULT NULL,
`c2` DECIMAL(18,5) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

当列被定义为DECIMAL(5,2)时,5为精度,2为刻度,精度表示值存储的有效位数,刻度表示小数点后可存储的位数。
当列被定义为DECIMAL(5,2)时,该列存储范围为-999.99值999.99。

定点数存储空间

定点数在存储时将整数部分和小数部分分开存储,每9位10进制数据需要4个byte来存储,不满9位的部分使用不同字节来存储:

如列类型为DECIMAL(30,4)时:

1、整数部分长度=30-4=26=9+9+8,整数部分需要存储空间=4+4+4=12
2、小数部分长度=4,小数部分需要存储空间=2
因此列类型为DECIMAL(30,4)时,其所需存储空间为12+2=14。

PS1:在查看执行计划时,key_len列表示索引列的长度,对于二级索引,该长度仅为索引列的长度,不包含主键列长度。在类型为DECIMAL(30,4)  NOT NULL 的列上建索引,则key_len列显示为14。如果类型为DECIMAL(30,4)  NULL的列上建索引,则key_len显示为15,需要额外的1个字节表示是否为NULL

存储空间溢出问题

在严格SQL模式下(sql_mode = 'TRADITIONAL'),发生存储值溢出问题会报错且操作无法执行成功。
在非严格SQL模式下(sql_mode = 'TRADITIONAL'),发生存储值溢出问题时会有警告(1265,Data truncated)且操作能执行完成,但:
1、如果值超过存储范围,则会当做该类型最大值处理,如对类型DECIMAL(5,2)的列插入10000,最终插入值为999.99。
2、如果小数部分超过存储范围,则会进行四舍五入处理,如对类型DECIMAL(5,2)的列插入10.555,最终插入值为10.56。

使用BIGINT来存放“定点数”

某些文章中会以各种理由而建议使用BIGINT类型来存放与钱相关的数据:
理由1:使用对于DECIMAL(18,2)来存放时,会导致某些统计数据不准如银行计算利息。
这并不是DECIMAL的问题,而是程序设计不严谨导致,以存钱利息为例,单个用户的利息计算最终精确到分,分以后部分被抹去,但统计多个用户时,
分以后部分又被累计相加,导致总金额"变多"。
解决办法:增大数据类型精度,调整统计算法。

理由2:使用BIGINT能有效降低存储空间
BIGINT使用8字节来存储数据,数据范围为-9223372036854775808 到 9223372036854775807(922亿亿,整数部分19位),
如果我们将数据扩大10000倍来存放,那么BIGINT类型对应存放数据类型为DECIMAL(19,4),其存储空间为10字节,降低2个字节。

理由3:不同数值类型计算对CPU的消耗不同。
以主流服务器CPU运算能力来看,不同数值类型造成的CPU影响有限。

受FLOAT和DOUBLE两种浮点数类型不能精确存储数据的影响,导致部分研发在不明真相情况下会排斥使用DECIMAL类型,但存在即合理,每种数据类型都有其优缺点和适用场景

MySQL DataType--定点数(Fixed-Point Types)学习的更多相关文章

  1. MySQL大表优化方案 Mysql的row_format(fixed与dynamic)

    转自:https://mp.weixin.qq.com/s/VY69wWlrVLjRtKU7ULrYGw 当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除 ...

  2. mysql与sql server参照对比学习mysql

    mysql与sql server参照对比学习mysql 关键词:mysql语法.mysql基础 转自桦仔系列:http://www.cnblogs.com/lyhabc/p/3691555.html ...

  3. MySQL DataType--浮点数(Floating-Point Types)学习

    浮点数(Floating-Point Types) MySQL支持两种浮点数类型来表示近似值:1.FLOAT,单精度浮点数,使用4字节存储,存储数据范围3.402823466E+38 - -1.175 ...

  4. 《MySQL必知必会》学习笔记——第1章 了解SQL

    第1章 了解SQL 本章将介绍数据库和SQL,它们是学习MySQL的先决条件. 1.1 数据库基础 你正在阅读本书,这表明你需要以某种方式与数据库打交道.在深入学习MySQL及其SQL语言的实现之前, ...

  5. MySQL分表(Partition)学习研究报告

    最近在开发一个新的项目,可能会产生大数据量,需要对部分表进行分表操作,故来研究学习MySQL的分表功能. 由于实验报告已经写成Exlce文件了,各位看过就直接下载吧:MySQL分表分析报告.xls 以 ...

  6. MySQL 体系结构以及各种文件类型学习汇总 (转)

    1,mysql体系结构 由数据库和数据库实例组成,是单进场多线程架构. 数据库:物理操作系统文件或者其它文件的集合,在mysql中,数据库文件可以是frm.myd.myi.ibd等结尾的文件,当使用n ...

  7. 《mysql必知必会》学习_第八章_20180730_欢

    第八章学习LIKE操作符,百分百(%)通配符,下划线(_)通配符 P47 select prod_id,prod_name from products where prod_name LIKE 'je ...

  8. Mysql的row_format(fixed与dynamic)

     在mysql中, 若一张表里面不存在varchar.text以及其变形.blob以及其变形的字段的话,那么张这个表其实也叫静态表,即该表的row_format是fixed,就是说每条记录所占用的字节 ...

  9. MySQL系统变量auto_increment_increment与auto_increment_offset学习总结

    在MySQL中,系统变量auto_increment_increment与auto_increment_offset是与自增列相关的两个参数变量.在官方文档中,将其划分为Replication Mas ...

随机推荐

  1. ShoeBox一个超级好用的图片切割工具

    下载地址:http://renderhjs.net/shoebox/ ShoeBox是一个图片处理软件,体积很小. 我主要用第三个功能拆开图片.根据大图上的小图空白间隙来处理的. 导出后变成很多小图

  2. 禁用 Ubuntu 18.04 Files 的 Type Ahead search 功能

    . . . . . Ubuntu 的文件浏览器(Files)提供了一个搜索的功能,叫做“Type Ahead search”.即我们在文件浏览器中输入某个文件的名字时,Files 并不是将焦点定位在某 ...

  3. Playbooks简介

    Playbooks简介 关于Playbooks Playbook简单示例 基本组成 主机和用户 任务列表 Handlers: 配置更改时运行操作 执行Playbook Ansible-Pull Lin ...

  4. XT交易所Websocket API

    WebSocketAPI xt为用户提供了一个简单的而又强大的API,旨在帮助用户快速高效的将xt交易功能整合到自己应用当中. WebSocket服务地址 xt WebSocket服务连接地址:wss ...

  5. Prometheus监控教程——从入门到放弃

    Prometheus的安装还是比较简单的 下载地址如下 https://prometheus.io/download/ 解压,修改配置,运行.默认监听9090端口 [root@localhost ~] ...

  6. Python技术点

    调试过程中遇到的问题,继上一篇博文! (1)爬取第一个页面之后名字链接页面存在分页情况 解决方案:根据子网页,选择合适的正则表达式,获取页面数,根据页面数自动生成换页URL (2)测试过程中某些网页数 ...

  7. dd命令的使用

    1.dd命令的使用 dd命令用于复制文件并对源文件的内容进行转换和格式化处理,在有需要的时候可以使用dd命令对物理磁盘进行操作,使用dd对磁盘操作时,最好使用块设备文件. (1)命令语法 dd (选项 ...

  8. Openresty 健康检查

    ## 指定共享内存 lua_shared_dict healthcheck 1m; ## 在worker初始化过程中,启动定时器,进行后端结点的检查 init_worker_by_lua_block ...

  9. JVM中内存的设置和分配(最大内存,总内存,剩余内存的区别)

    1.设置分配的内存大小 -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M -vmargs 说明后面是VM的参数,所以后面的 ...

  10. Feign调用时读取超时(Read timed out executing GET)解决

    解决方式(很多人比较关注,所以放在最前面): 因为Feign调用默认的超时时间为一分钟,一分钟接口不能返回就会抛出异常,所以在服务端的yml文件中增加如下配置即可解决: # feign调用超时时间配置 ...