SQL上の計算でもunsignedは有効

MySQLでunsigned属性を付けたカラムで計算すると負の値が扱えないということを知らなかった。
例えばこんな感じのテーブルを作っておいて

create table hoge (
foo int unsigned,
bar int unsigned,
baz int,
qux int
);
insert into hoge values (5, 10, 5, 10);
select * from hoge;
+------+------+------+------+
| foo  | bar  | baz  | qux  |
+------+------+------+------+
|    5 |   10 |    5 |   10 |
+------+------+------+------+

unsigned属性の付いたカラムのfooとbarで計算すると

select foo - bar from hoge;
+----------------------+
| foo - bar            |
+----------------------+
| 18446744073709551611 |
+----------------------+

となる。Tableに入れなくてもSQL上の計算でこのような結果になることを知らなかった。片方のカラムがunsigned属性の場合も同じで

select foo - qux from hoge;
select baz - bar from hoge;

これも負の結果は得られない。
両方にunsigned属性がなければ上手くいく。

select baz - qux from hoge;
+-----------+
| baz - qux |
+-----------+
|        -5 |
+-----------+

SQLで計算している間は単なる数値として扱われると勝手に思い込んでいた。他のDBでも同じかな。

コメントする

メールアドレスが公開されることはありません。