1. ホーム
  2. mysql

[解決済み] MySQLでvarchar(max)に相当するもの?

2022-03-04 21:56:45

質問

MySQLでvarchar(max)に相当するものは何ですか?

どのように解決するのですか?

varchar の最大長は、MySQL の最大行サイズである 64KB (BLOB を含まない) に従います。

VARCHAR(65535)

ただし、マルチバイトの文字セットを使用する場合は、上限が低くなることに注意してください。

VARCHAR(21844) CHARACTER SET utf8


以下はその例です。

行の最大サイズは65535ですが、varcharには与えられた文字列の長さをエンコードするための1〜2バイトも含まれています。ですから、たとえそれがテーブルの唯一の列であっても、実際には最大行サイズのvarcharを宣言することはできません。

mysql> CREATE TABLE foo ( v VARCHAR(65534) );
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

しかし、長さを減らしていくと、うまくいく最大の長さを見つけることができるのです。

mysql> CREATE TABLE foo ( v VARCHAR(65532) );
Query OK, 0 rows affected (0.01 sec)

ここで、テーブルレベルでマルチバイト文字セットを使おうとすると、各文字を複数バイトとしてカウントしてしまうことがわかります。UTF8文字列は 必ずしも は文字列ごとにマルチバイトを使用しますが、MySQL は今後の挿入をすべてシングルバイト文字に制限すると仮定することはできません。

mysql> CREATE TABLE foo ( v VARCHAR(65532) ) CHARSET=utf8;
ERROR 1074 (42000): Column length too big for column 'v' (max = 21845); use BLOB or TEXT instead

最後のエラーが教えてくれたにもかかわらず、InnoDBはまだ21845の長さを好まないのです。

mysql> CREATE TABLE foo ( v VARCHAR(21845) ) CHARSET=utf8;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

これは、21845*3 = 65535と計算すれば完璧に納得がいくのですが、どうせうまくいかないでしょう。一方、21844*3 = 65532と計算すれば、うまくいく。

mysql> CREATE TABLE foo ( v VARCHAR(21844) ) CHARSET=utf8;
Query OK, 0 rows affected (0.32 sec)