MySQL «Странное» поведение MySQL

Писал как-то я PHP-скрипт, и надо было мне вычесть из одного поля БД другое, и результат записать в третье поле, чтобы потом производить по нему сортировку. Но выяснилось, что при выполнении такого запроса:
UPDATE `items` SET `s_diff`=`s_in`-`s_out`
иногда получаются очень странные результаты. Например, если s_in = 10, а s_out = 20, то вместо ожидаемого -10 в поле s_diff будет записано число 2147483647 (Примечание: поля s_in и s_out имеют тип UNSIGNED INT).

Сначала я подумал, что это баг и начал искать в интернете информацию на эту тему, но вскоре с удивлением обнаружил, что это вовсе и не баг, а так и было задумано разработчиками MySQL. Прочитав документацию, я разобрался в этом вопросе. В документации сказано, что если одно из полей имеет тип UNSIGNED (т.е. число без знака), то результат вычитания тоже будет UNSIGNED. Если же нам нужно число со знаком, мы можем использовать функцию приведения типов для получения необходимого результата:
UPDATE `items` SET `s_diff`=CAST(`s_in`-`s_out` AS SIGNED)
В результате выполнения этого запроса мы получим нужный нам результат -10

  4 января 2009  |    MySQL  |    Spider
  MySQL, баг

Комментарии (2)

Holy Diver | 10 апреля 2009, 11:14
Заметил опечатку: чтобы потом производиь по нему сортировку.
Я раньше тоже не задумывался о SIGNED и UNSIGNED, но как-то решил провести эксперименты по их производительности. Правильный выбор SIGNED или UNSIGNED даёт прирост в скорости.
Как наберу побольше информации на эту тему - напишу статью.
Spider | 14 апреля 2009, 22:21
Спасибо, очень интересно будет почитать!

Добавить комментарий

Ваше имя: *
Ваш e-mail: * (не публикуется)
Адрес сайта:
Комментарий: *
полужирный курсив курсив курсив вставить ссылку

  

Новости сайта в RSS

Категории

Статьи

Новые Популярные Комментируемые

Облако меток

Разное

Продажа авто Воронеж, покупка авто в Воронеже, авто с пробегом в Воронеже