MySQL 如何处理超出范围的数值?
mysqlmysqli database
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)