MySQL 如何处理超出范围的数值?


MySQL 对超出列数据类型允许范围的数值的处理方式取决于 SQL 模式,具体如下:

(A) 启用严格 SQL 模式 - 当启用严格 SQL 模式时,MySQL 会在输入超出范围的值时返回错误。在这种情况下,部分或全部值的插入将失败。

例如,我们创建了一个表,其中两列的数据类型分别为 TINYINT 和 UNSIGNED TINYINT。

mysql> Create table counting(Range1 Tinyint, Range2 Tinyint Unsigned);
Query OK, 0 rows affected (0.14 sec)

现在,使用以下命令启用严格 SQL 模式。

mysql> Set SQL_MODE ='traditional';
Query OK, 0 rows affected (0.00 sec)

现在,如果尝试将超出范围的值插入列中,MySQL 将返回错误,并且两个插入操作都将失败,这可以通过以下查询进行检查:

mysql> Insert into Counting(Range1, Range2) Values(256,256);
ERROR 1264 (22003): Out of range value for column 'Range1' at row 1

mysql> Select * from counting;
Empty set (0.00 sec)

(B) 禁用严格 SQL 模式 - 当禁用严格 SQL 模式时,MySQL 会将值裁剪到该列数据类型的合适端点,并存储结果值。MySQL 会发出警告,这些警告是由于裁剪而发生的列赋值转换的结果。

例如,如果在禁用严格 SQL 模式后将值插入列中,MySQL 将发出警告,并在裁剪到合适的端点后存储值。这可以通过以下查询理解:

mysql> Set SQL_MODE = '';
Query OK, 0 rows affected (0.00 sec)

mysql> Insert Into Counting(Range1,Range2) values (256,256);
Query OK, 1 row affected, 2 warnings (0.02 sec)

mysql> Show Warnings;
+---------+------+-------------------------------------------------+
| Level   | Code | Message                                         |
+---------+------+-------------------------------------------------+
| Warning | 1264 | Out of range value for column 'Range1' at row 1 |
| Warning | 1264 | Out of range value for column 'Range2' at row 1 |
+---------+------+-------------------------------------------------+
2 rows in set (0.00 sec)

mysql> Select * from Counting;
+--------+--------+
| Range1 | Range2 |
+--------+--------+
| 127    | 255    |
+--------+--------+
1 row in set (0.00 sec)

更新于:2020年1月30日

580 次浏览

启动你的职业生涯

完成课程获得认证

开始学习
广告