長年知らなかったが、「VARCHAR」と「〜TEXT」では最大文字数の意味が違っていた!!!
試してみる
CREATE TABLE t1 (s VARCHAR(255) NOT NULL); CREATE TABLE t2 (s TINYTEXT NOT NULL); INSERT INTO t1 VALUES ( REPEAT('a', 1024) ), ( REPEAT('あ', 1024) ); INSERT INTO t2 VALUES ( REPEAT('a', 1024) ), ( REPEAT('あ', 1024) ); SELECT LEFT(s, 3), LENGTH(s), CHAR_LENGTH(s) from t1; +------------+-----------+----------------+ | LEFT(s, 3) | LENGTH(s) | CHAR_LENGTH(s) | +------------+-----------+----------------+ | aaa | 255 | 255 | | あああ | 765 | 255 | +------------+-----------+----------------+ SELECT LEFT(s, 3), LENGTH(s), CHAR_LENGTH(s) from t2; +------------+-----------+----------------+ | LEFT(s, 3) | LENGTH(s) | CHAR_LENGTH(s) | +------------+-----------+----------------+ | aaa | 255 | 255 | | あああ | 255 | 85 | +------------+-----------+----------------+
「VARCHAR(255)」も「TINYTEXT」も、どちらも255文字だと思っていたが、
- VARCHAR(N)では、上限はマルチバイトを考慮した文字数で決まる。
- TINYTEXT,TEXT,LONGTEXTでは、上限はバイト数で決まる。
ゆえに、VARCHAR(255)では、文字長は 255文字、バイト数は765バイトが上限となる(MySQLのutf-8は最大3バイトだったはずなので)。
一方、TINYTEXT,TEXT,LONGTEXTでは、上限はバイト数で決まるため、最大の文字数はマルチバイト文字の数によって異なる。