VARCHAR型
VARCHAR型の特徴的な点として,
mysql> CREATE TABLE vch(vc VARCHAR(4)) CHARACTER SET latin1; Query OK, 0 rows affected (0.03 sec)
まずはテーブル作成を行っています。CHAR型で行ったときと同様に,
mysql> INSERT INTO vch(vc) VALUES ('a b '); Query OK, 1 row affected (0.01 sec) mysql> INSERT INTO vch(vc) VALUES ('a b'); Query OK, 1 row affected (0.01 sec)
続けて,
mysql> SELECT CONCAT('(',vc,')') FROM vch; +--------------------+ | CONCAT('(',vc,')') | +--------------------+ | (a b ) | | (a b) | +--------------------+ 2 rows in set (0.00 sec)
以上のように,
このほか注意する点として,
mysql> select CONCAT('(',vc,')') from vch where vc = 'a b'; +--------------------+ | CONCAT('(',vc,')') | +--------------------+ | (a b ) | | (a b) | +--------------------+ 2 rows in set (0.00 sec)
上のように,
mysql> select CONCAT('(',vc,')') from vch where vc = 'a b '; +--------------------+ | CONCAT('(',vc,')') | +--------------------+ | (a b ) | | (a b) | +--------------------+ 2 rows in set (0.00 sec)
VARCHAR型で指定できる長さ
VARCHARでも指定できる文字数は0文字以上65,535文字以下となっています。それではCHAR型のときと同様に試してみましょう。
mysql> CREATE TABLE vch2(vc VARCHAR(0)) SET latin1; Query OK, 0 rows affected (0.01 sec)
上記の結果のように0文字の時は問題ありませんでした。それでは65,535文字を指定した場合はどうなるか確認してみましょう。
mysql> CREATE TABLE vch3(vc VARCHAR(65535)) CHARACTER SET latin1; 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 vch3(vc VARCHAR(65532)) CHARACTER SET latin1; Query OK, 0 rows affected (0.01 sec) mysql> CREATE TABLE vch4(vc VARCHAR(65533) NOT NULL) CHARACTER SET latin1; Query OK, 0 rows affected (0.01 sec)
2カラム以上で作成する場合
また今回は1カラムだけで作成していますが,
mysql> CREATE TABLE vch5(vc1 VARCHAR(21843) NOT NULL,vc2 VARCHAR(21843) NOT NULL,vc3 VARCHAR(21843) NOT NULL) CHARACTER SET latin1; Query OK, 0 rows affected (0.01 sec)
確認のためにvc1のカラムの型の値を1増やしてみると,
mysql> CREATE TABLE vch6(vc1 VARCHAR(21844) NOT NULL,vc2 VARCHAR(21843) NOT NULL,vc3 VARCHAR(21843) NOT NULL) CHARACTER SET latin1; 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
これはVARCHAR型のみで起こる問題ではありませんが,
マルチバイト文字を使う場合
加えて注意をしなければならない事としては,
mysql> CREATE TABLE vch7(vc VARCHAR(16383) NOT NULL) CHARACTER SET utf8mb4; Query OK, 0 rows affected (0.03 sec)
1増やして16,384文字を指定した場合を確認すると,
mysql> CREATE TABLE vch7(vc VARCHAR(16384) NOT NULL) CHARACTER SET utf8mb4; ERROR 1074 (42000): Column length too big for column 'c' (max = 16383); use BLOB or TEXT instead
蛇足ではありますが,
つまり,
まとめ
今回はMySQLのCHAR型とVARCHAR型の使い方について紹介をしました。名前が似ているにもかかわらず挙動がかなり違うので,