是否MySQL的(5.0.45)喜欢做奇怪内部类型转换与无符号数学?我存储的无符号整数,但选择基本算术时,我得到离谱的数字:

mysql> create table tt ( a integer unsigned , b integer unsigned , c float );
Query OK, 0 rows affected (0.41 sec)

mysql> insert into tt values (215731,216774,1.58085);
Query OK, 1 row affected (0.00 sec)

mysql> select a,b,c from tt;
+--------+--------+---------+
| a      | b      | c       |
+--------+--------+---------+
| 215731 | 216774 | 1.58085 |
+--------+--------+---------+
1 row in set (0.02 sec)

mysql> select (a-b)/c from tt;
+---------------------+
| (a-b)/c             |
+---------------------+
| 1.1668876878652e+19 |
+---------------------+
1 row in set (0.00 sec)

mysql> -- WHAT?
mysql> select a-b from tt;
+----------------------+
| a-b                  |
+----------------------+
| 18446744073709550573 |
+----------------------+
1 row in set (0.02 sec)

我认为这必须做的事实,减法为负,因此它正试图将结果映射到一个无符号和溢出?我显然是有符号改变一切解决这个问题,但我更愿意和我的32位整数,多一点积极的空间。

我还没有在MySQL以前碰到这个我敢肯定,我已经做了很多与MySQL的无符号运算;这是一个常见的问题?

有帮助吗?

解决方案

如果任一左手侧或减法运算符的右手侧是无符号的,其结果是无符号的为好。您可以通过设置NO_UNSIGNED_SUBTRACTION SQL模式改变这种

另外,您还可以显式转换为签署BIGINT值,然后做减法的无符号值。

其他提示

尝试这样:

mysql> select cast(cast(a-b as unsigned) as signed)/c from tt;

+-----------------------------------------+
| cast(cast(a-b as unsigned) as signed)/c |
+-----------------------------------------+
|                       -659.771639688953 | 
+-----------------------------------------+
1 row in set (0.00 sec)

参考: http://dev.mysql.com /doc/refman/5.0/en/cast-functions.html

是的,中间减法做了64位环绕。既然你预期的32位整数,但实际上拿到64,没有理由使用未签名。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top