mysql-unsigned属性ってなに?

mysqlでテーブルを作成するときに何気なくつけてたunsigned
ちょっと気になったので調べてみました。

全ての整数タイプは、任意の(標準ではない) 拡張子である UNSIGNED を持つ事ができます。正数だけをコラムの中で許可し、大きい上位数値範囲が必要な時には符号無しの値を利用できます。例えば、INT カラムが UNSIGNED の時、カラム範囲のサイズは同じですが、その終点は -2147483648 と 2147483647 から、0 と 4294967295 までシフトします。
http://dev.mysql.com/doc/refman/5.1/ja/numeric-types.html

要するに数字を扱う場合でマイナスの値を必要としない時はunsigned属性を付けた方が使える値の範囲が増えるのでより効率的にデータを使えるようになるんですね!

指定なし:Signed
タイプ バイト 最小値 最大値
TINYINT 1 -128 127
SMALLINT 2 -32768 32767
MEDIUMINT 3 -8388608 8388607
INT 4 -2147483648 2147483647
BIGINT 8 -9223372036854775808 9223372036854775807
unsigned属性指定
タイプ バイト 最小値 最大値
TINYINT 1 0 255
SMALLINT 2 0 65535
MEDIUMINT 3 0 16777215
INT 4 0 4294967295
BIGINT 8 0 18446744073709551615

調べてたらunsigned zerofillという文字も見つかったのでこれも調べてみたら

デフォルトはスペースである埋め込み文字はゼロで置き換えられます。例えば、INT(5) ZEROFILL として宣言されたカラムには、4 の値は 00004 として表示されます。もし整数カラムの中に表示幅よりも大きい値を格納すると、MySQLが複雑なJOINに対してテンポラリテーブルを生成した時に問題が発生するという事に注意してください。これはMySQLは、データは元のカラム幅に収まると仮定するからです。

注:ZEROFILL 属性はカラムが式や UNION クエリに含まれている時は無効になります。

これは要するに0で埋めて桁数を揃えるみたい。

PHPでのWEBの開発をやっていて桁数を揃える必要もなかったのでZEROFILL 属性は必要なさそうな印象

使える値の範囲が増えるunsigned属性は積極的に使っていきたい!

最大値を越える値が登録される場合は最大値で丸められるので設計時にどこまで値が増えるかしっかり見極めないとダメですね