MySQL数值类型溢出的处理方法

mysql SET sql_mode = 'TRADITIONAL'; -- 首先设置严格模式mysql INSERT INTO t1 (i1, i2) VALUES(256, 256);ERROR 1264 (22003): Out of range value for column 'i1' at row 1mysql SELECT * FROM t1;Empty set (0.00 sec)
mysql SELECT CAST(9223372036854775807 AS UNSIGNED) + 1;+-------------------------------------------+| CAST(9223372036854775807 AS UNSIGNED) + 1 |+-------------------------------------------+| 9223372036854775808 |+-------------------------------------------+

这种状态下,借使启用了 NO_UNSIGNED_SUBTRACTION SQL 情势,则结果为负

DROP TABLE IF EXISTS `na`;CREATE TABLE `na` (n1 INT(0) NOT NULL DEFAULT '0',n2 INT(11) NOT NULL DEFAULT '0');
mysql SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';mysql SELECT CAST(0 AS UNSIGNED) - 1;+-------------------------+| CAST(0 AS UNSIGNED) - 1 |+-------------------------+| -1 |+-------------------------+

假诺此类操作的结果用于更新 UNSIGNED
整数列,则结果将裁剪为列类型的最大值,假使启用了
NO_UNSIGNED_SUBTRACTION 则裁剪为 0。但万后生可畏启用了从严的 SQL
情势,则会发生错误何况列保持不改变。

MySQL 数值类型溢出管理

假设未启用严峻 SQL 形式,对于 ALTEHighlander TABLE,LOAD DATA INFILE,UPDATE
和多行 INSERT等语句会由于裁剪而产生的列分配调换何况引发一个警戒。

mysql SELECT 9223372036854775807 + 1;ERROR 1690 (22003): BIGINT value is out of range in '(9223372036854775807 + 1)'

我们举一个例证,如若 t1 表的结构如下

为了演示这些难点,大家先要创制多少个表

数值表明式求值进度中的溢出会致使错误,比如,因为最大的有标记 BIGINT 值是
9223372036854775807,因而以下表明式会生出错误

例如启用了从严的 SQL 格局,则 MySQL 会遵照 SQL
规范拒却带有错误的超过范围的值,並且插入退步若无启用任何限定方式,那么 MySQL
会将值裁剪到列数据类型范围的前后限值并积累当超过范围的值分配给整数列时,MySQL
会蕴藏表示列数据类型范围的对应端点的值
当为浮点或定点列分配的值大于钦定精度和比重所满含的范围时,MySQL
会蕴藏表示该限量的相应端点的值

卡尺头数值之间的裁减,要是内部多个品种为 UNSIGNED
,默许情状下会变卦无符号结果。假若为负,则会引发错误

mysql SET sql_mode = ''; -- 禁用所有模式mysql INSERT INTO t1 (i1, i2) VALUES(256, 256);mysql SHOW WARNINGS;+---------+------+---------------------------------------------+| Level | Code | Message |+---------+------+---------------------------------------------+| Warning | 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 |+------+------+

末尾大家读抽出来看看

mysql SET sql_mode = '';Query OK, 0 rows affected (0.00 sec)mysql SELECT CAST(0 AS UNSIGNED) - 1;ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'

为了在此种场馆下使操作成功,必要将值转变为 unsigned

从三头说,是或不是发生溢出决定于操作数的界定,因而管理前叁个表达式的另生机勃勃种方法是选择精确值算术,因为
DEMondeoL 值的约束大于整数

当严刻格局被禁用,值能够插入,但会被裁剪,并且引发二个告诫

CREATE TABLE t1 (i1 TINYINT,i2 TINYINT UNSIGNED);

总结

我们那生机勃勃章节来说讲整型溢出难点。

下一场我们运用上边包车型大巴言辞往 na 表中插入一些数据

当 MySQL
在有些数值列上存款和储蓄超过列数据类型允许范围的值时,结果决议于此时生效的 SQL
格局

mysql INSERT INTO `na` VALUES(520,520),(5201314,5201314);Query OK, 2 rows affected (0.02 sec)Records: 2 Duplicates: 0 Warnings: 0

后记

来,考考大家一个题目,在 MySQL 中当某一列设置为 int(0State of Qatar 时会生出什么样 ?

一切都以套路,套路….基本都和 SQL 形式有关…

mysql SELECT 9223372036854775807.0 + 1;+---------------------------+| 9223372036854775807.0 + 1 |+---------------------------+| 9223372036854775808.0 |+---------------------------+

对的,好像什么都不会发生,没什么难点才是没有错,小编就怕有如何难题…哈哈

以上正是这篇小说的全体内容了,希望本文的故事情节对大家的读书只怕干活富有一定的仿效学习价值,多谢大家对剧本之家的支撑。

mysql SELECT * FROM na;+---------+---------+| n1 | n2 |+---------+---------+| 520 | 520 || 5201314 | 5201314 |+---------+---------+2 rows in set (0.00 sec)

软件之家 ,而只要启用了适度从紧情势,这几个语句会直接战败,况兼未插入或退换部分或任何值,具体决计于表是或不是为事务表和其余因素。

若是启用了适度从紧的 SQL 格局,超过范围会时有发生三个错误

那一个,应该很好驾驭呢?

相关文章

发表评论