機械系大学生の修行ログ

sh-lu0's Tech Blog

アイドルが力をくれる

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バイト)にする