MySQL → «Странное» поведение MySQL
Писал как-то я PHP-скрипт, и надо было мне вычесть из одного поля БД другое, и результат записать в третье поле, чтобы потом производить по нему сортировку. Но выяснилось, что при выполнении такого запроса:
Сначала я подумал, что это баг и начал искать в интернете информацию на эту тему, но вскоре с удивлением обнаружил, что это вовсе и не баг, а так и было задумано разработчиками MySQL. Прочитав документацию, я разобрался в этом вопросе. В документации сказано, что если одно из полей имеет тип UNSIGNED (т.е. число без знака), то результат вычитания тоже будет UNSIGNED. Если же нам нужно число со знаком, мы можем использовать функцию приведения типов для получения необходимого результата:
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
