系列文章目录
前言
MySQL中的数值类型包括整数类型、浮点数类型和定点数类型。本节就对MySQL中的数值类型进行简单的介绍。
1、数值类型
1.1整数类型
MySQL中的整数类型包括TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)和BIGINT。不同的整数类型,其所需要的存储空间和数值范围不尽相同。
如下表,MySQL支持的整数类型所需的存储和范围
类型 | 存储空间(Bytes) | 最小有符号 | 最小无符号 | 最大有符号 | 最大无符号 |
---|---|---|---|---|---|
TINYINT | 1 | -128 | 0 | 127 | 255 |
SMALLINT | 2 | -32768 | 0 | 32767 | 65535 |
MEDIUMINT | 3 | -8388608 | 0 | 8388607 | 16777215 |
INT | 4 | -2147483648 | 0 | 2147483647 | 4294967295 |
BIGINT | 8 | -2^63 | 0 | 2^63 -1 | 2^64-1 |
由上表可以看出,不同的整数类型所表示的数值范围不同。同一种整数类型,有符号与无符号所表示的数值范围也不同。其中,有符号整数的最小值是一个负数,无符号整数的最小值是0。
如果使用的数据类型超出了整数类型的范围,则MySQL会抛出相应的错误。因此在实际使用的时候,应该首先确认好数据的取值范围,然后根据确认的结果选择合适的整数类型。
mysql> CREATE TABLE t_test1(id INT);
使用SHOW CREATE TABLE语句查看t_test的创建信息。
mysql> SHOW CREATE TABLE t_test1 \G
*************************** 1. row ***************************
Table: t_test1
Create Table: CREATE TABLE `t_test1` (
`id` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1.2 精确值类型-DECIMAL
十进制和数字类型存储精确的数字数据值。在保持精确精度很重要时使用这些类型,例如使用货币数据。在MySQL中,数字是实现为十进制的,所以下面关于十进制的注释同样适用于数字
在十进制列声明中,可以指定精度和比例(而且通常是)。例如:
CREATE TABLE t3 (d1 DECIMAL,d2 DECIMAL(5, 2));
接下来,查看t3数据表的建表信息。
mysql> SHOW CREATE TABLE t3 \G
在创建数据表t8时并没有为d1字段设置精度和标度,此时,MySQL会自动为d1字段设置精度为10,标度为0。
此时,MySQL并没有报错,只是会显示一个警告,接下来查看警告信息。
向t8表中插入数据。
mysql> INSERT INTO t3 (d1, d2) VALUES (3.14, 3.14);
此时,MySQL并没有报错,只是会显示一个警告,接下来通过SHOW WARNINGS;
查看警告信息。
MySQL的警告信息中显示d1字段的值被截断了。接下来查看t3表中的数据。
在插入数据时,d1字段的值为3,d2字段的值为3.14,再次证明了当创建数据表时,如果不给DECIMAL类型的字段设置精度和标度,则DECIMAL默认的精度为10,标度为0。此时,向数据表中插入数据会舍弃所有小数部分。
再次向t3表中插入数据。
mysql> INSERT INTO t8 (d1, d2) VALUES (1, 3.141);
此时,向d1字段插入数值1,t2字段插入数据3.141。查看t3表中的数据。
d2字段中的值,由于精度和标度的限制也被截断了。也就是说,在定点数类型中,如果小数位数超出了标度的限制,则会被截断处理。
接下来再次向t3表中插入数据。
mysql> INSERT INTO t3 (d1, d2) VALUES (11111111111, 3.14);
此时,向t3表的d1字段中插入一个超出了精度和标度的数值,MySQL报错了。
对比浮点数类型和定点数类型,可以总结出如下不同之处:
·浮点数类型中的FLOAT类型和DOUBLE类型在不指定精度时,默认会按照计算机硬件和操作系统决定的精度进行表示;而定点数类型中的DECIMAL类型不指定精度时,默认为DECIMAL(10,0)。
当数据类型的长度一定时,浮点数能够表示的数据范围更大,但是浮点数会引起精度问题,不适合存储高精度类型的数据。
1.3 近似值浮点类型-FLOAT和DOUBLE
浮点数类型主要有两种:单精度浮点数FLOAT和双精度浮点数DOUBLE。浮点数类型所需的存储空间
FLOAT和DOUBLE类型表示近似的数字数据值。MySQL使用4个字节表示单精度值,使用8个字节表示双精度值。
浮点数类型中的FLOAT和DOUBLE类型在不指定数据精度时,默认会按照实际的计算机硬件和操作系统决定的数据精度进行显示。如果用户指定的精度超出了浮点数类型的数据精度,则MySQL会自动进行四舍五入操作。
创建数据表t4,t4表中包含两个字段f和d,f字段是FLOAT类型,d字段是DOUBLE类型。
mysql> CREATE TABLE t4 (f FLOAT, d DOUBLE);
接下来向数据表t4中插入数据。
mysql> INSERT INTO t4 (f, d) VALUES (3.14, 5.98);
查看t4表中的数据。
可以看出,能够正确地插入并显示数据。接下来再次向t4表中插入数据。
mysql> INSERT INTO t4 (f, d) VALUES (3.144444444444444, 5.98999999999999999999999);
此时,再次查看t4表中的数据。
可以看到,为FLOAT类型和DOUBLE类型插入超出数据类型精度的数据时,MySQL对插入的数据进行了四舍五入处理