mysql-unsigned属性ってなに?
mysqlでテーブルを作成するときに何気なくつけてたunsigned
ちょっと気になったので調べてみました。
全ての整数タイプは、任意の(標準ではない) 拡張子である UNSIGNED を持つ事ができます。正数だけをコラムの中で許可し、大きい上位数値範囲が必要な時には符号無しの値を利用できます。例えば、INT カラムが UNSIGNED の時、カラム範囲のサイズは同じですが、その終点は -2147483648 と 2147483647 から、0 と 4294967295 までシフトします。
http://dev.mysql.com/doc/refman/5.1/ja/numeric-types.html
要するに数字を扱う場合でマイナスの値を必要としない時はunsigned属性を付けた方が使える値の範囲が増えるのでより効率的にデータを使えるようになるんですね!
タイプ | バイト | 最小値 | 最大値 |
---|---|---|---|
TINYINT | 1 | -128 | 127 |
SMALLINT | 2 | -32768 | 32767 |
MEDIUMINT | 3 | -8388608 | 8388607 |
INT | 4 | -2147483648 | 2147483647 |
BIGINT | 8 | -9223372036854775808 | 9223372036854775807 |
タイプ | バイト | 最小値 | 最大値 |
---|---|---|---|
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属性は積極的に使っていきたい!
最大値を越える値が登録される場合は最大値で丸められるので設計時にどこまで値が増えるかしっかり見極めないとダメですね