BETA

MySQLのストレージを意識する

投稿日:2018-12-06
最終更新:2018-12-09
※この記事は外部サイト(https://sh-lu0.hatenablog.com/entry/2018/1...)からのクロス投稿です

めちゃ長い数を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ビット→2^2→4通り
8ビット→2^8→256通り

< byte >
1バイト=8ビット
1バイト→8ビット→2^8→256
4バイト→2^32→4294967296

まとめ

  • 型ごとに必要なストレージが決まってる
  • 符号ありの場合は,1番前のビットが±に使われて4バイトの場合2^7となって,データ量が半分になる
  • TINYINTは1ビットで足りるが,デフォが1バイト=8ビットなので,文字数制限1にしてエラーを防ぐ
  • INTで足りないような莫大なデータを使用する時はBIGINT(8バイト)にする
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@shlu0の技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!