MySQLでUNSIGNED値を計算した結果がマイナスになるとエラーになる場合の対処法。

タイトルのとおりです。
微妙にはまったのでメモ。

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で一時的に型を変える事で回避は可能。