MySQLでUNSIGNED値を計算した結果がマイナスになるとエラーになる場合の対処法。
2014年3月27日
タイトルのとおりです。
微妙にはまったのでメモ。
CREATE TABLE `user` ( `name` VARCHAR(255) NOT NULL, `age` INT(11) UNSIGNED NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO user SET name="A君",age=20; INSERT INTO user SET name="Bさん",age=5;
ageがUNSIGNED。
A君は20歳。Bさんは5歳です。
で、10年前の年齢を取得しようと思います。
SELECT name, age - 10 FROM user; -> ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(`hoge_db`.`user`.`age` - 10)'
すると、こんなエラーがでます。
どうやらUNSIGNEDは、マイナスの値を入れる事ができないだけではなく、マイナスになる計算もできないようですね・・。
アプリで処理をするか、そもそもUNSIGNED型を変えてしまってもいいような気もしますが、現在の状態からSQLで解決したいので、CASTで型変換をします。
SELECT name, CAST(age AS SIGNED) - 10 FROM user; +-----------+--------------------------+ | name | CAST(age AS SIGNED) - 10 | +-----------+--------------------------+ | A君 | 10 | | Bさん | -5 | +-----------+--------------------------+
結論
UNSIGNEDは、マイナス値が入らないだけでなく、マイナスになる計算もできない。
CASTで一時的に型を変える事で回避は可能。