Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: UNSIGNED баг или фича?
 
 автор: loli   (03.03.2011 в 17:18)   письмо автору
 
 

Есть поле test INT(10) UNSIGNED DEFAULT 0

Добавляю в него запись например число 5.

Потом делаю вычитание большего числа
UPDATE `base` SET `test` = `test` - 10

В итоге в поле test появляетс запись 4294967295
а вообще хотелось бы 0?
обьясните кто нибудь, почему такое поведение?

  Ответить  
 
 автор: cheops   (03.03.2011 в 17:26)   письмо автору
 
   для: loli   (03.03.2011 в 17:18)
 

Все верно, это связано с битовым представлением чисел, если вы используете знаковое число, то 31-й бит отводится под флаг знака: 0 это +, 1 это -. Если вы используете беззнаковое число битовая арифметика не меняется, однако бит, который отводился в знаковом числе под знак, теперь используется для дополнительного разряда (поэтому беззнаковые числа допускают в два раза большие значения, чем знаковые) - отсюда такие дикие значения, так как при переходе 0, происходит операция переполнения разряда (31-й бит получает 1) и число "проворачивается".

  Ответить  
 
 автор: cheops   (03.03.2011 в 17:31)   письмо автору
 
   для: loli   (03.03.2011 в 17:18)
 

Вообще, если нужно, чтобы число всегда было положительным, лучше само значение сделать знаковым, а на UPDATE повесить триггер, который бы следил, чтобы число меньше 0 не становилось.

  Ответить  
 
 автор: loli   (03.03.2011 в 17:52)   письмо автору
 
   для: cheops   (03.03.2011 в 17:31)
 

Спасибо за ответы )

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования