mariadb中的奇怪行为:BIGINT UNSIGNED超出范围

问题描述

在调试应用程序中的错误选择时,我们偶然发现了mariadb10.3.22和mariadb10.1中一个奇怪的行为。

以下查询失败:

SELECT UNIX_TIMESTAMP() - 9999999999999999999; // 19 digits

错误1690(22003):BIGINT UNSIGNED值超出了'unix_timestamp()-9999999999999999999'中的范围

但是,增加或减少次偷偷摸摸的工作:

MariaDB [(none)]> SELECT UNIX_TIMESTAMP() - 99999999999999999999; // 20 digits

+-----------------------------------------+
| UNIX_TIMESTAMP() - 99999999999999999999 |
+-----------------------------------------+
|                   -99999999998396888357 |
+-----------------------------------------+
MariaDB [(none)]> SELECT UNIX_TIMESTAMP() - 999999999999999999; // 18 digits

+---------------------------------------+
| UNIX_TIMESTAMP() - 999999999999999999 |
+---------------------------------------+
|                   -999999998396888251 |
+---------------------------------------+

更改次要符号也可以:

SELECT UNIX_TIMESTAMP() + -9999999999999999999; // 19 digits

+-----------------------------------------+
| UNIX_TIMESTAMP() + -9999999999999999999 |
+-----------------------------------------+
|                    -9999999998396886079 |
+-----------------------------------------+

我还尝试在sql_mode中设置NO_UNSIGNED_SUBTRACTION,但这也不起作用。

有人可以解释这个行为吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)