[转帖]MySQL定点数类型DECIMAL用法详解

mysql,定点数,类型,decimal,用法,详解 · 浏览次数 : 0

小编点评

**一、 MySQL DECIMAL 数据类型** * DECIMAL 数据类型用于存储精确的数值。 * 它可以存储 D 位小数的 P 位数。 * 范围:`1〜65.P`。 **二、 DECIMAL 的存储方式和占用空间** | 数据类型 | 存储方式 |占用空间 | |---|---|---| | DECIMAL(P,D) | 字符串 | `(M+2)`个字节 | | `column_name DECIMAL(P);`  | 否 | **三、 DECIMAL 数据类型示例** ```sql CREATE TABLE test_order ( id INT AUTO_INCREMENT PRIMARY KEY, description VARCHAR(255), cost DECIMAL(19,4) NOT NULL ); ``` **四、 精度问题测试** * **FLOAT**:精度受取值范围的限制,四舍五入后直接截断。 * **DOUBLE**:精度更高,但仍然受取值范围的限制。 * **DECIMAL**:精度最高,但仍然受取值范围的限制。 **五、 比较结果** | 数据类型 | SUM(f2) | |---|---| | FLOAT | 1.1 | | DOUBLE | 1.1 | | DECIMAL | 1.1 | **结论** * DECIMAL 数据类型用于存储精确的数值,但其取值范围受限。 * 不同的精度数据类型具有不同的存储方式和占用空间。 * 精度问题测试表明,小数点在存储过程中会发生截断或舍入。

正文

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用法详解 相似的内容:

[转帖]MySQL定点数类型DECIMAL用法详解

https://www.cnblogs.com/danielzzz/p/16824214.html 一、MySQL DECIMAL 的使用 DECIMAL 数据类型用于在数据库中存储精确的数值,我们经常将该数据类型用于保留准确精确度的列,例如会计系统中的货币数据。 要定义数据类型为DECIMAL的列

[转帖]MySQL数据类型(decimal的存储大小)

本来还以为MySQL的数据类型挺简单的,没想到竟然有很多坑,容我仔细道来 MySQL数据类型 整数类型(注意是字节) 浮点型(重点关注decimal) 字符型(注意这是4.x版本的定义,5.x以后已经将其中的字节转换成字符了) 日期类型 MySQL日期类型表示方法与字符串的表示方法相同(用单引号括起

[转帖]MySQL总长字符类型优化

https://blog.csdn.net/weixin_32254411/article/details/113535526 阿里规范中有一条 varchar是可变长字符串,不预先分配存储空间,长度不要超过5000,如果存储长度 大于此值,定义字段类型为 text,独立出来一张表,用主键来对应,避

[转帖]阿里规范 - 五、MySQL 数据库 - (一)建表规约 - 8 - 【强制】varchar 是可变长字符串,不预先分配存储空间,长度不要超过 5000,如果存储长 度大于此值,定义字段类型为 text,独立出来一张表,用主键来对应,避免影响其它字段索 引效率。

字段类型为 text,独立出来一张表,用主键来对应,避免影响其它字段索 引效率。 1、因为mysql 是行存储模式,所以会把整行读取出来。text 储存了大量的数据。读取时,占了大量的io。所以会十分的慢。 2、每行的数据过大 行溢出 InnoDB 会将一些大对象数据存放在数据页之外的 BLOB 页

[转帖]巨坑的crontab环境变量导致定时脚本无法运行

https://www.jianshu.com/p/03fd78061e88 在CentOS7中跑MySQL定时备份脚本,单独执行脚本能够正常执行,但是设置好定时任务后开始一直无法执行。 操作: 1、查看定时任务是否设置好 crontab -l image.png 显示已经设置好了定时任务2、查看任

【转帖】MySQL索引

数据表如何用索引快速查找 索引是 排好序的快速查找的数据结构 索引存储在文件系统中 索引的文件存储形式与存储引擎有关 索引数据结构:可以是二叉树、红黑树、Hash表、B-Tree、B+Tree 1、二叉树 使用索引的如下图:(如果是使用二叉树结构)每一个节点都存放数据行的磁盘地址【快速定位到数据】

[转帖]实战瓶颈定位-我的MySQL为什么压不上去

https://plantegg.github.io/2023/06/20/%E5%AE%9E%E6%88%98%E7%93%B6%E9%A2%88%E5%AE%9A%E4%BD%8D-%E6%88%91%E7%9A%84MySQL%E4%B8%BA%E4%BB%80%E4%B9%88%E5%8E%

[转帖]实战瓶颈定位-我的MySQL为什么压不上去–写场景

https://plantegg.github.io/2023/06/30/%E5%AE%9E%E6%88%98%E7%93%B6%E9%A2%88%E5%AE%9A%E4%BD%8D-%E6%88%91%E7%9A%84MySQL%E4%B8%BA%E4%BB%80%E4%B9%88%E5%8E%

[转帖]第一章 MySQL 8.0 介绍及安装配置

第一章 MySQL 8.0 介绍及安装配置 https://www.jianshu.com/p/d190c6b3520d 本课程,适合具备一定Linux运维或者开发基础的朋友,课程定级中、高级DBA。只要掌握80%,轻松助力薪资15k-25K。课程内容均来自与MySQL官网+MySQL源码。配套精品

[转帖]第二章 MySQL的体系结构与基础管理

第二章 MySQL的体系结构与基础管理 https://www.jianshu.com/p/6d017ac5e685 本课程,适合具备一定Linux运维或者开发基础的朋友,课程定级中、高级DBA。只要掌握80%,轻松助力薪资15k-25K。课程内容均来自与MySQL官网+MySQL源码。配套精品视频