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は、将来のすべての挿入を1バイト文字に制限するとは想定できません。
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)