🏗

[MySQL] VARCHARと文字数

VARCHAR(255) はいったい何文字格納できるのか、ドキュメントには以下のように書いてあった。 VARCHAR の引数が文字数になるように、テーブルを作成したときの文字コードによって最大文字数を変えてくれているみたい。

VARCHAR カラムの有効な最大長は、最大行サイズ (65535 バイト) と使用される文字セットによって決まります。

https://dev.mysql.com/doc/refman/5.6/ja/char.html

つまり、1 バイト文字なら VARCHAR(65535) まで、2 バイト文字なら VARCHAR(32767) までということになる。 よくつかわれる utf8mb4 なら 65535 / 4 ≒ VARCHAR(16383)となるはず。

実際に utf8mb4 を指定したテーブルで VARCHAR(16384) のカラムを定義してみると、以下のエラーが表示された。 やはり、4 バイト文字の場合の最大長は 16383 らしい。

1074: Column length too big for column 'name' (max = 16383); use BLOB or TEXT instead

興味深いのは、テーブルによってエラーの内容が違うこと。 定義できるはずの VARCHAR(16483)を定義しようとしたところ、以下のエラーが表示されるテーブルがあった。 カラムのサイズというよりは、行全体のサイズに引っかかっている様子。最大サイズの制限はいろいろあるらしい。

Error 1118: 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

こういう場合、エラーメッセージにもあるとおり、 VARCHAR の代わりに TEXT または BLOB を使うのが適切か。 TEXTBLOB に格納した値は、カラムとは別の場所にデータを保存するので、行全体のサイズにカウントされない。