MySQLのカラム型による使用バイト数について調べたこと
DB設計をしていて、MySQLについての制約について調べたことをメモ
varchar型の使用バイト数
- limitが255のときは1byte
- limitが256のときは2bytes
CakePHP3のマイグレーションでstring型を指定した場合、limitを設定しなければ255となります。
参考:MySQLのvarcharサイズは256ではなく255がよい - はむはむエンジニアぶろぐ
数値型の使用バイト数
- TINYINT型: 1byte
- SMALLINT型: 2bytes
- MEDIUMINT型: 3bytes
- INTEGER型: 4bytes
参考:数値型のストレージ要件
TINYINT型って実は-128-127
(符号なしの場合は0-255
の範囲まで扱えます。
(1桁の値しか扱えないという先入観を持っていたのは内緒)
そういえばドラクエ4でカジノのコインを大量に買うと桁あふれを起こし、お手頃価格で変えるのを思い出した。 MEDIUMINT型を使っていたのか。
参考:【838861枚】 - ドラゴンクエスト大辞典を作ろうぜ!!第三版 Wiki*
数値型の長さはどう決めるといいの?
昔はハードの性能的にかなりギリギリを攻めていたようだが、最近はそこまで厳密ではないらしい。
「TINYINT型とSMALLINT型の違いは、100万レコードでも1MB」(先輩談
とはいえ型の指定から、設計者が想定した世界観や規模感は読み解けるよね、とも。 例えばBIGINT型を使っていれば、そのカラムではそれだけ多くの値を扱う可能性を想定していた、ということになる。
逆に性別などのマスタをBIGINT型にしていたら、あんまり考えて設計してなかったのでは...ということも想像できる
おわりに
設計時の意図を伝えるために、TINYINT, SMALLINT, INT, BIGINTは使い分けようと思います。 (MEDIUMINT型をわざわざ使わなそう...)