Karp 的技术博客

MySQL中Decimal类型和Float/Double等区别

在MySQL中,存在floatdouble等非标准数据类型,以及decimal这种标准数据类型。它们之间的区别如下:

  • floatdouble等非标准类型在数据库中保存的是近似值,而decimal则以字符串的形式保存数值。
  • floatdouble类型可以存储浮点数(即小数类型),但是float有一个问题,当给定的数据是整数时,它会以整数形式存储。这在处理货币值时会遇到问题,例如,如果默认值为0.00,实际存储的却是0;同样,如果存储货币值为12.00,实际存储的是12。
  • 幸好MySQL提供了decimal这个数据类型,它可以轻松解决上述问题。decimal类型在MySQL中以相同的类型实现,这符合SQL92标准。它们用于保存对准确精度有重要要求的值,例如与金钱有关的数据。

数据定义

  • float(M,S):其中M表示全长,S表示小数点后的长度。以下是一个示例:
CREATE TABLE t1 (c1 float(10,2), c3 decimal(10,2));
INSERT INTO t1 VALUES (9876543.21, 9876543.12);
SELECT * FROM t1;

输出结果如下:

+------------+------------+
|     c1     |     c3     |
+------------+------------+
| 9876543.00 | 9876543.12 |
+------------+------------+
  • 再举一个例子:DECIMAL(5,2)
CREATE TABLE t1 (id1 float(5,2) DEFAULT NULL, id2 double(5,2) DEFAULT NULL, id3 decimal(5,2) DEFAULT NULL);
INSERT INTO t1 VALUES (1.2345, 1.2345, 1.2345);
SHOW WARNINGS;

输出结果如下:

+-------+------+------------------------------------------+
| Level | Code |                  Message                 |
+-------+------+------------------------------------------+
| Note  | 1265 | Data truncated for column 'id3' at row 1 |
+-------+------+------------------------------------------+

解释:

  • 1.2345:小数点后最多2位,可以保存,但会有一个警告。
  • 12.34:符合限制,可以保存。
  • 1234.5:小数部分未满2位,需要补0,应该保存为1234.50。但整个位数超过了5,保存时报错。
  • 1.2:小数部分未满2位,需要补0,按照1.20保存。

默认状态比较

  • 浮点数如果不指定精度和标度,会按照实当然可以!下面是您可以直接复制到博客中的Markdown格式的文本:

在MySQL中,存在floatdouble等非标准数据类型,以及decimal这种标准数据类型。它们之间的区别如下:

  • 存储方式:floatdouble类型以二进制形式存储近似值,而decimal类型以字符串形式存储数值。
  • 精度:floatdouble类型是近似值,其精度取决于所分配的存储空间。而decimal类型是精确值,它以指定的精度和标度来存储数据。
  • 存储空间:floatdouble类型的存储空间是固定的,它们分别占用4字节和8字节。而decimal类型的存储空间是可变的,它的长度取决于指定的精度和标度。

在使用这些数据类型时,需要根据具体的需求来选择合适的类型。如果需要存储对精度要求较高的数据,特别是涉及货币等需要精确计算的场景,建议使用decimal类型。而对于一般的科学计算等情况,floatdouble类型可能更为适用。


请注意,以上文本已经使用Markdown格式编写,您可以直接将其复制到您的博客编辑器中,并进行格式化和发布。

mysql

版权属于:karp
作品采用:本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
更新于: 2023年12月02日 04:33
7

目录

来自 《MySQL中Decimal类型和Float/Double等区别》