MySQL MySQL如何处理超出范围的数值?
在使用 MySQL 数据库时,有时候会遇到某些字段的数值超出了其可接受的范围,此时 MySQL 数据库会怎么处理呢?本文将会介绍。
阅读更多:MySQL 教程
MySQL数据类型
在介绍 MySQL 处理超出范围的数值之前,我们需要了解一下 MySQL 中的数据类型,以下为 MySQL 中常用的数据类型:
- TINYINT:一个字节,范围为 -128 到 127。
- SMALLINT:两个字节,范围为 -32768 到 32767。
- MEDIUMINT:三个字节,范围为 -8388608 到 8388607。
- INT:四个字节,范围为 -2147483648 到 2147483647。
- BIGINT:八个字节,范围为 -9223372036854775808 到 9223372036854775807。
除此之外,MySQL还有其他的数据类型,比如FLOAT、DOUBLE、DECIMAL等等,不同的数据类型在存储空间和存储精度方面都有所区别。在 MySQL 中,我们可以通过修改表结构来更改字段的数据类型。
超出范围的数据
当我们向一个超出范围的数据类型存储数据时,MySQL 会根据不同的情况进行不同的处理。以下是不同情况下 MySQL 的处理方式:
整型字段
- 当向整型字段中存储的数据超出了该字段的可接受范围时,MySQL 会将该值截断为字段的最大或最小值。
- 如果是无符号整型字段,存储超出范围的数值时,会执行取模运算,将该值模除字段能存储的最大值,将余数存储进去。
具体代码演示:
CREATE TABLE test(
id INT(11),
tinyint_signed TINYINT(1),
tinyint_unsigned TINYINT(1) UNSIGNED
);
INSERT INTO test VALUES (1, 128, 255), (2, -129, -1);
查询结果:
SELECT * FROM test;
id | tinyint_signed | tinyint_unsigned |
---|---|---|
1 | 127 | 255 |
2 | -128 | 0 |
FLOAT字段
在 FLOAT 字段中存储过大或过小的数值时,MySQL 会将这些值存储为特定的常数,可通过以下代码查看:
CREATE TABLE test(
id INT(11),
float_type FLOAT(8, 2)
);
INSERT INTO test VALUES (1, 999999999999999999.99), (2, -999999999999999999.99);
SELECT * FROM test;
查询结果:
id | float_type |
---|---|
1 | 0 |
2 | -Infinity |
DECIMAL字段
在 DECIMAL 字段中存储数值过大或过小时,MySQL 不会进行向上或向下取整,而是将该数值存储为 NULL,例如:
CREATE TABLE test(
id INT(11),
decimal_type DECIMAL(2,1)
);
INSERT INTO test VALUES (1, 10.1), (2, -10.1);
SELECT * FROM test;
查询结果:
id | decimal_type |
---|---|
1 | NULL |
2 | NULL |
结论
MySQL 的处理超出范围数据的方式主要取决于存储的字段类型,其中整型字段、FLOAT 字段和 DECIMAL 字段分别拥有不同的处理方式。为了避免不必要的问题,建议在设计数据表结构时,充分考虑实际需求,选择相应的数据类型和字段长度。