Question

Est-ce que MySQL (5.0.45) aiment faire typecasts internes étranges avec les mathématiques non signés? Je stocke des entiers non signés, mais lors de la sélection arithmétique de base, je reçois des numéros scandaleux:

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)

Je suppose que cela a à voir avec le fait que la soustraction est négatif et il est donc d'essayer de cartographier les résultats dans un non signé et débordant? Je peux résoudre ce apparemment en changeant tout pour signer, mais je préfère avoir un peu plus d'espace positif avec mes entiers de 32 bits.

Je ne l'ai pas rencontré ce avant sur MySQL et je suis assez certain que je l'ai fait beaucoup avec l'arithmétique non signé MySQL; est-ce un problème commun?

Était-ce utile?

La solution

Si soit le côté gauche ou le côté droit de l'opérateur de soustraction est non signé, le résultat est non signé aussi bien. Vous pouvez modifier cela en définissant le NO_UNSIGNED_SUBTRACTION mode SQL .

Vous pouvez également convertir explicitement vos valeurs non signées à signer les BIGINT et faire la soustraction.

Autres conseils

essayez ceci:

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)

Référence: http://dev.mysql.com /doc/refman/5.0/en/cast-functions.html

Yep, la soustraction intermédiaire a une enveloppante 64 bits. Étant donné que vous attendiez des entiers 32 bits, mais réellement obtenir 64, il n'y a aucune raison d'utiliser non signé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top