信頼はずっと、挑戦はもっと。

お問い合わせ
TEL:03-3496-3888

BLOG コアテックの社員ブログ (毎週月曜~金曜更新中)

2021

15

2月

MySQLの最大行サイズは65,535 バイトらしいです

テクログ

## 試した環境


* 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バイト 少ないデータ量なので問題ないのは納得です。



## 最大行サイズぴったりだとアウトなんですかね


不明です。


このブログ投稿のエディタには太字がないのか。

この記事を書いた人

画像:投稿者アイコン

インドア

所 属:
WEBインテグレーション事業部
出身地:
埼玉
仕事内容:
開発