https://www.cnblogs.com/danielzzz/p/16824214.html

一、MySQL DECIMAL 的使用

DECIMAL 数据类型用于在数据库中存储精确的数值,我们经常将该数据类型用于保留准确精确度的列,例如会计系统中的货币数据。

要定义数据类型为DECIMAL的列,请使用以下语法:

column_name DECIMAL(P,D);

在上面的语法中:

  • P是表示有效数字数的精度。P范围为1〜65
  • D是表示小数点后的位数。D的范围是0~30。MySQL要求D小于或等于(<=)P
  • DECIMAL(P,D)表示列可以存储D位小数的P位数。十进制列的实际范围取决于精度和刻度。

关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。

与INT数据类型一样,DECIMAL类型也具有UNSIGNEDZEROFILL属性。 如果使用UNSIGNED属性,则DECIMAL UNSIGNED的列将不接受负值。【取值范围只有正数部分,而不是像整数类型一样取值范围翻倍】

如果使用ZEROFILL,MySQL将把显示值填充到0以显示由列定义指定的宽度。 另外,如果我们对DECIMAL列使用ZEROFILL,MySQL将自动将UNSIGNED属性添加到列。

以下示例使用DECIMAL数据类型定义的一个叫作amount的列。

amount DECIMAL(6,2);

在此示例中,amount列最多可以存储6位数字,小数位数为2位; 因此,amount列的范围是从-9999.999999.99

MySQL允许使用以下语法:

column_name DECIMAL(P);
 

这相当于:在这种情况下,列不包含小数部分或小数点。此外,我们甚至可以使用以下语法。

 
column_name DECIMAL;
 

在这种情况下,P的默认值为10


二、DECIMAL 的存储方式以及占用空间

DECIMAL的存储方式和其他数据类型都不同,它是以字符串形式存储的。假设一个字段为DECIMAL(3,0),当我们存入100时,实际上存入的1、0、0这三个字符拼接而成的字符串的二进制值,由于一个数字字符占用1个字节,所以共占用三个字节的空间。然后还要存入描述该数据的元数据,元数据固定占用2个字节,所以共占用5个字节。

总结:DECIMAL(M,N)会占用(M+2)个字节。


三、DECIMAL数据类型示例

首先,创建一个名为test_order的新表,其中包含三列:iddescriptioncost

CREATE TABLE test_order (
id INT AUTO_INCREMENT PRIMARY KEY,
description VARCHAR(255),
cost DECIMAL(19,4) NOT NULL
);
 

第二步,将资料插入test_order表。

INSERT INTO test_order(description,cost)
VALUES('Bicycle', 500.34),('Seat',10.23),('Break',5.21);
 

第三步,从test_order表查询数据。

SELECT * from test_order
 

查询结果:

第四步,更改cost列以包含ZEROFILL属性。

ALTER TABLE test_order
MODIFY cost DECIMAL(19,4) zerofill;
 

第五步,再次查询test_order表。

 

查询结果:

如上所见,在输出值中填充了许多零。

因为zerofill,当我们插入负值会报错:Out of range value for column ...

其它插入测试结论:

  • 当数值在其取值范围之内,小数位多了,则四舍五入后直接截断多出的小数位。
  • 若数值在其取值范围之外,则直接报Out of range value错误。

四、精度问题测试

FLOAT、DOUBLE、DECIMAL 这三种数据类型的精度问题测试

1、建表语句

DROP TABLE IF EXISTS `test_float`;
CREATE TABLE test_float(
`f1` FLOAT,
`f2` DOUBLE,
`f3` DEC(10,2)
);

2、插入测试数据

INSERT INTO test_float(f1,f2,f3) VALUES(0.47,0.47,0.47),(0.44,0.44,0.44),(0.19,0.19,0.19);

3、查询结果

SELECT SUM(f1),SUM(f2),SUM(f3) FROM test_float;

查询结果如下:

FLOAT、DOUBLE 类型求和的结果都出现了精度损失,但是 DOUBLE 的精度更高。他们求和的结果都无限接近 1.10。

4、比较结果

执行如下sql可知:

SELECT SUM(f2) = 1.1,SUM(f2) = 1.1,SUM(f3) = 1.1 FROM test_float;

0 表示 false;1 表示 true。

 
分类: MySQL

[转帖]MySQL定点数类型DECIMAL用法详解的更多相关文章

  1. mysql中event的用法详解

    一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ...

  2. Mysql中limit的用法详解

    Mysql中limit的用法详解 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,为我们提供了limit这样一个功能. SELECT * FROM table LIMIT [offset ...

  3. [转帖]强大的strace命令用法详解

    强大的strace命令用法详解 文章转自: https://www.linuxidc.com/Linux/2018-01/150654.htm strace是什么? 按照strace官网的描述, st ...

  4. MySQL数据类型DECIMAL用法详解

    MySQL DECIMAL数据类型用于在数据库中存储精确的数值.我们经常将DECIMAL数据类型用于保留准确精确度的列,例如会计系统中的货币数据. 要定义数据类型为DECIMAL的列,请使用以下语法: ...

  5. mysql中in的用法详解

    一.基础用法 mysql中in常用于where表达式中,其作用是查询某个范围内的数据. select * from where field in (value1,value2,value3,-) 当 ...

  6. mysql的event(事件)用法详解

    SELECT * FROM mysql.event;SET GLOBAL event_scheduler = 1; -- 开启定时器 0:off 1:on SHOW VARIABLES LIKE 'e ...

  7. mysql数据库explain命令用法详解

    本文转自一位前辈的文章,感觉写得很好,就转过来了.这个是那位前辈的原文地址:http://www.111cn.net/database/mysql/81698.htm    当我们在优化SQL时,想看 ...

  8. mysql中limit的用法详解[数据分页常用]

    在我们使用查询语句的时候,经常要返回前几条或者中间某几行的数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能. SELECT * FROM table LIMIT [offset ...

  9. mysql中 where in 用法详解

    这里分两种情况来介绍 1.in 后面是记录集,如: select  *  from  table  where   uname  in(select  uname  from  user); 2.in ...

  10. Mysql导入导出工具Mysqldump和Source命令用法详解

    Mysql本身提供了命令行导出工具Mysqldump和Mysql Source导入命令进行SQL数据导入导出工作,通过Mysql命令行导出工具Mysqldump命令能够将Mysql数据导出为文本格式( ...

随机推荐

  1. python异步编程之asyncio低阶API

    低阶API介绍 asyncio中低阶API的种类很多,涉及到开发的5个方面.包括: 获取事件循环 事件循环方法集 传输 协议 事件循环策略 本篇中只讲解asyncio常见常用的函数,很多底层函数如网络 ...

  2. Android 事件分发介绍

    目录 一.目的 二.环境 三.相关概念 3.1 事件分发 四.详细设计 4.1应用布局 4.1.1 应用布局结构 4.1.2 LayoutInspector 4.2 关键View&方法 4.2 ...

  3. vue音频(监听播放完成)

    <template> <div> <audio ref="audio" :src="audioSrc"></audio ...

  4. Prometheus配置Basic Auth进行安全防护,实现登录控制

    本文分享自华为云社区<Prometheus配置Basic Auth进行安全防护,实现登录控制>,作者:可以交个朋友. 一.Prometheus Basic Auth 使用背景 在日常pro ...

  5. Java中观察者模式与委托,还在傻傻分不清

    摘要:本文通过对比Java中观察者模式与委托,希望能够让开发者分清二者的区别和联系. 本文分享自华为云社区<Java中观察者模式与委托的对比>,作者: 小小张自由--张有博 . 代码背景 ...

  6. APP安全加固怎么做?加固技术、加固方法、加固方案

    ​ 前面的文章中我们为大家介绍了移动应用安全检测的测试依据.测试方法.和测试内容,本文我们着重分享App安全加固的相关内容. ​ (安全检测内容) 通过前面的文章我们知道了app安全检测要去检测哪些内 ...

  7. 火山引擎DataLeap的Catalog系统搜索实践 (二):整体架构

    整体架构 火山引擎DataLeap的Catalog搜索系统使用了开源的搜索引擎Elasticsearch进行基础的文档检索(Recall阶段),因此各种资产元数据会被存放到Elasticsearch中 ...

  8. Apache Pulsar 在火山引擎 EMR 的集成与场景

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 近年来,基于云原生架构的新一代消息队列和流处理引擎 Apache Pulsar 在大数据领域发挥着愈发重要的作用, ...

  9. IDEA画图神器 PlantUML

    PlantUML 是一款开源的UML图绘制工具,支持通过文本来生成图形,使用起来非常高效.可以支持时序图.类图.对象图.活动图.思维导图等图形的绘制. 下面使用PlantUML来绘制一张流程图,可以实 ...

  10. Go--append()

    作用:在原切片的末尾添加元素 实例: package main import "fmt" func main() { s1 := []int{} fmt.Printf(" ...