VARCHAR と 〜TEXT の違い


長年知らなかったが、「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バイトが上限となる(MySQLutf-8は最大3バイトだったはずなので)。
一方、TINYTEXT,TEXT,LONGTEXTでは、上限はバイト数で決まるため、最大の文字数はマルチバイト文字の数によって異なる。