|
|
|
| Есть поле test INT(10) UNSIGNED DEFAULT 0
Добавляю в него запись например число 5.
Потом делаю вычитание большего числа
UPDATE `base` SET `test` = `test` - 10
В итоге в поле test появляетс запись 4294967295
а вообще хотелось бы 0?
обьясните кто нибудь, почему такое поведение? | |
|
|
|
|
|
|
|
для: loli
(03.03.2011 в 17:18)
| | Все верно, это связано с битовым представлением чисел, если вы используете знаковое число, то 31-й бит отводится под флаг знака: 0 это +, 1 это -. Если вы используете беззнаковое число битовая арифметика не меняется, однако бит, который отводился в знаковом числе под знак, теперь используется для дополнительного разряда (поэтому беззнаковые числа допускают в два раза большие значения, чем знаковые) - отсюда такие дикие значения, так как при переходе 0, происходит операция переполнения разряда (31-й бит получает 1) и число "проворачивается". | |
|
|
|
|
|
|
|
для: loli
(03.03.2011 в 17:18)
| | Вообще, если нужно, чтобы число всегда было положительным, лучше само значение сделать знаковым, а на UPDATE повесить триггер, который бы следил, чтобы число меньше 0 не становилось. | |
|
|
|
|
|
|
|
для: cheops
(03.03.2011 в 17:31)
| | Спасибо за ответы ) | |
|
|
|