普段MySQL使っていても意外と忘れるのでこちらに備忘録として残します.
例えば, こんな感じのtestテーブルがあるとします.
# | Column Name | 種別 | 属性 |
---|---|---|---|
1 | id | int | |
2 | signed_column | int | |
3 | unsigned_column | int | unsigned |
ここに signed_column: 1, unsigned_column: 1としてデータを挿入します.
id | signed_column | unsigned_column |
---|---|---|
1 | 1 | 1 |
2つのカラムを合算するようなqueryを実行します.
SELECT id, `signed_column` + `unsigned_column` AS sum FROM `test`;
当然このqueryの結果は, 下記のようになります.
id | sum |
---|---|
1 | 2 |
次に同様に, signed_column:-2, unsigned_column: 1としてデータを挿入します.
id | signed_column | unsigned_column |
---|---|---|
1 | 1 | 1 |
2 | -2 | 1 |
先ほどと同じqueryを実行します.
SELECT id, `signed_column` + `unsigned_column` AS sum FROM `test`
すると, 下記のようなエラーになってしまいます...
#1690 - BIGINT UNSIGNED value is out of range in '(`test`.`signed_column` + `test`.`unsigned_column`)';
このエラーを防ぐにはUNSIGNEDなカラムをCASTしてから計算すると良いです.
SELECT id, `signed_column` + CAST(`unsigned_column` AS SIGNED) AS sum FROM `test`;
これで求めていた結果が算出できるようになります.
id | sum |
---|---|
1 | 2 |
2 | -1 |
両方がINT型だと思って単純に計算しようとしてもこういった意外なところでエラーになるので気をつけたいですね.