公開日:2021.02.15

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

テクログdb

## 試した環境

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

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

不明です。

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

この記事を書いた人

インドア

入社年2017年

出身地埼玉県

業務内容開発

特技または趣味映画・アニメ鑑賞、ゲーム、散歩、勉強

インドアの記事一覧へ

テクログに関する記事一覧