MySQL 5.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模式,则会发生错误,并且列保持不变。