MySQL 在评估数值表达式期间如何处理溢出?


正如我们所知,如果在评估数值表达式期间发生溢出,MySQL 将产生一个错误。例如,最大的有符号 BIGNT 是 9223372036854775807,因此以下表达式会产生错误 −

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

MySQL 能够按照以下方式处理此类溢出

通过将值转换为无符号

MySQL 通过将值转换为无符号启用此类运算,如下所示 −

mysql> Select CAST(9223372036854775807 AS UNSIGNED) +1;
+------------------------------------------+
| CAST(9223372036854775807 AS UNSIGNED) +1 |
+------------------------------------------+
|                      9223372036854775808 |
+------------------------------------------+
1 row in set (0.07 sec)

通过使用精确值运算

MySQL 可以使用精确值运算来处理前面的表达式。这是因为溢出的发生取决于操作数的范围。例如,可以按如下方式使用 DECIMAL 值进行上述计算 −

mysql> Select 9223372036854775807.0 + 1;
+---------------------------+
| 9223372036854775807.0 + 1 |
+---------------------------+
|     9223372036854775808.0 |
+---------------------------+
1 row in set (0.01 sec)

更新于: 2020-06-20

188 次浏览

开启您的 职业生涯

完成课程并获得认证

立即开始
广告