2021.02.15
STAFF BLOG
スタッフブログ
TECHNICAL
テクログ
## 試した環境
* XAMPP v3.2.3
* mysql Ver 15.1 Distrib 10.1.38-MariaDB, for Win64 (AMD64)
mariaDBなので厳密にはMySQLではないと思いますが無視しています。MySQLであると思っています。
## 最大行サイズ
MySQLの最大行サイズは **65,535 バイト**らしいです
テーブルの内部表現の最大行サイズは 65,535 バイトであり、ストレージエンジンがこれ以上のサイズの行をサポートできる場合でもこのサイズになります。BLOB または TEXT カラムはこのサイズに 9 から 12 バイトしか関与しないので、これらのカラムはこのサイズに含まれません。
https://dev.mysql.com/doc/refman/5.6/ja/storage-requirements.html
## 試す
以下の状況だとエラーにはならない
* varchar => 文字コードの1文字に使われるバイト数×長さ のバイトが確保される
* utf8 は1文字あたり3バイト使われる
* MySQLの最大行サイズは **65,535 バイト**
* int で**4バイト**確保される
* のこり使えるバイト数 65535 – 4 = **65531バイトのはず**
* utf8のvarcharで 65531 / 3 = 21843.666….
* 21843 文字は使えそうですが**実際にはエラーになりました**
* 21842 文字は大丈夫でした
## 実際に使用されるデータ量を計算してみる
### 前提として varchar は長さを格納するために 2バイト 使用します
> 可変長カラムのストレージには長さバイトが含まれ、これには行サイズに対して評価されます。たとえば、VARCHAR(255) CHARACTER SET utf8 カラムは、値の長さを格納するために 2 バイトを使用するので、それぞれの値は最大 767 バイトを使用できます。
https://dev.mysql.com/doc/refman/5.6/ja/column-count-limit.html
varcharだと**2バイト**は値の長さを格納するのに使うらしいです。
### 踏まえて計算してみる
* 21843 文字の場合、使用されるバイト数は 21843 * 3 + 2 = 65,531バイト
* int型の4バイトを足すと **65,535 バイト** になります。最大行サイズと一致しますが、65,535 バイトは駄目っていうことですかね。それとも別のデータを格納しているから駄目とか。
* 21842 文字の場合、使用されるバイト数は 21842 * 3 + 2 = 65,528バイト
* int型の4バイトを足すと **65,532 バイト** になります。最大行サイズより 3バイト 少ないデータ量なので問題ないのは納得です。
## 最大行サイズぴったりだとアウトなんですかね
不明です。
このブログ投稿のエディタには太字がないのか。