Baby step - 思考と実験の足跡

日常のちょっとした、気になって試したこと集です。

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型をわざわざ使わなそう...)