MySQLのストレージを意識する
めちゃ長い数をINSERTしたら限界って怒られた
14桁のidつっこんだところ
ERROR 1264 (22003): Out of range value for column 'id' at row 1
mysql> DESC items; +-----------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+------------------+------+-----+---------+----------------+ | id | int(11) unsigned | NO | PRI | NULL | auto_increment | | parent_id | int(11) | YES | | NULL | | | message | varchar(100) | YES | | NULL | | +-----------+------------------+------+-----+---------+----------------+
int(11)だからかな・・・??
文字数制限増やしたらええやろ! idの長さをint(11)→int(20)に変更
私「20桁までいけるで!」
ERROR 1264 (22003): Out of range value for column 'id' at row 1
o(;△;)o
ストレージを考慮すべきだった
文字数の長さとは別に,ストレージでINSERTできる容量が決まっていた.
MySQL :: MySQL 5.6 リファレンスマニュアル :: 11.7 データ型のストレージ要件 MySQLデータ型一覧 (詳細) - Miuran Business Systems
型名 | 必要なストレージ | 符号なしの範囲 |
---|---|---|
TINYINT | 1バイト | 0~255 |
INT | 4バイト | 0~4294967295 (43億) |
文字数制限を20文字に増やしても,ストレージがオーバーしていればINSERTできない.
ビットとバイト
bit(binary digit) 二進法の 数字 → 二進数
コンピュータ内部における情報表現の最小単位で、データの容量を表す単位
0か1の2通り
1ビット→2通り
2ビット→22→4通り
8ビット→28→256通り
byte
1バイト=8ビット
1バイト→8ビット→28→256
4バイト→232→4294967296
まとめ
- 型ごとに必要なストレージが決まってる
- 符号ありの場合は,1番前のビットが±に使われて4バイトの場合27となって,データ量が半分になる
- TINYINTは1ビットで足りるが,デフォが1バイト=8ビットなので,文字数制限1にしてエラーを防ぐ
- INTで足りないような莫大なデータを使用する時はBIGINT(8バイト)にする