سؤال

هل 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