MySQLの整数、符号なし算術演算の問題?
質問
の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を取得しているため、符号なしを使用する理由はありません。
所属していません StackOverflow