[MySQL] VARCHARと文字数
VARCHAR(255)
はいったい何文字格納できるのか、ドキュメントには以下のように書いてあった。
VARCHAR の引数が文字数になるように、テーブルを作成したときの文字コードによって最大文字数を変えてくれているみたい。
VARCHAR カラムの有効な最大長は、最大行サイズ (65535 バイト) と使用される文字セットによって決まります。
つまり、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
を使うのが適切か。
TEXT
と BLOB
に格納した値は、カラムとは別の場所にデータを保存するので、行全体のサイズにカウントされない。