10bet网址
MySQL 5.7参考手册
相关文件10bet官方网站 下载本手册 从本手册中摘录

11.1.7超出范围和溢出处理

当MySQL存储在列数据类型允许范围之外的数字列中的值时,结果取决于当时的SQL模式:

  • 如果启用了严格的SQL模式,MySQL拒绝使用错误的超出范围值,并且插入失败,按照SQL标准失败。

  • 如果没有启用限制模式,则MySQL将值剪切到列数据类型范围的相应端点范围,并存储结果。

    当将超标值分配给整数列时,MySQL存储表示列数据类型范围的相应端点的值。

    当为浮点或定点列分配超过指定(或默认)精度和缩小的范围的值时,MySQL将表示表示该范围的相应端点的值。

假设一个表T1.有这个定义:

创建表T1(I1 Tinyint,I2 Tinyint unsigned);

通过启用严格的SQL模式,发生超出范围错误:

MySQL> Set SQL_Mode =“传统”;MySQL>插入T1(I1,I2)值(256,256);错误1264(22003):在第1行中的列'i1'的范围值超出范范围MySQL> Select * from T1;空集(0.00秒)

使用严格的SQL模式未启用,发生带警告的剪辑:

mysql> set sql_mode ='';MySQL>插入T1(I1,I2)值(256,256);mysql>显示警告;+ --------- + ------ + ------------------------------------------------------ + |水平|代码|消息|+ --------- + ------ + ------------------------------------------------------ + |警告|1264 | Out of range value for column 'i1' at row 1 | | Warning | 1264 | Out of range value for column 'i2' at row 1 | +---------+------+---------------------------------------------+ mysql> SELECT * FROM t1; +------+------+ | i1 | i2 | +------+------+ | 127 | 255 | +------+------+

当未启用严格的SQL模式时,由于剪切而发生的列分配转换将被报告为Marnings改变表加载数据更新和多排陈述。在严格的模式下,这些语句失败,部分或所有值未插入或更改,具体取决于表是事务表和其他因素。有关详细信息,请参阅第5.1.10节“服务器SQL模式”

数字表达式评估期间溢出导致错误。例如,最大的签名big值为9223372036854775807,因此以下表达式产生错误:

MySQL>选择9223372036854775807 + 1;错误1690(22003):BIGINT值超出''(9223372036854775807 + 1)'

要使操作能够在这种情况下成功,请将值转换为无符号;

MySQL> SELECT CAST(9223372036854775807作为unsigned)+ 1;+ ------------------------------------- + |演员(9223372036854775807 unsigned)+ 1 |+ ------------------------------------- + |9223372036854775808 |+ --------------------------------------

是否发生溢出取决于操作数的范围,所以处理前面表达式的另一种方法是使用精确值算术,因为十进制值具有比整数更大的范围:

MySQL>选择9223372036854775807.0 + 1;+ ------------------------ + |9223372036854775807.0 + 1 |+ ------------------------ + |9223372036854775808.0 |+ ------------------------ +

整数值之间的减法,其中一个类型无符号,默认情况下生成无符号结果。如果结果将是否定的,结果是错误的:

mysql> set sql_mode ='';查询OK,0行受影响(0.00秒)MySQL> Select Cast(0为unsigned) -  1;错误1690(22003):BIGINT unsigned值超出'(转换(0为未签名) -  1)'

如果是no_unsigned_subtraction.SQL模式已启用,结果为负:

mysql> set sql_mode ='no_unsigned_subtraction';MySQL> SELECT CAST(0为未签名) -  1;+ ----------------------- + |施放(0为unsigned) -  1 |+ ----------------------- + |-1 |+ ------------------------

如果这种操作的结果用于更新无符号整数列,结果将剪辑到列类型的最大值,或者如果no_unsigned_subtraction.已启用。如果启用了严格的SQL模式,则会发生错误,并且列保持不变。