サービスを作成する時に、
そこで今回は、
検証環境
今回使用した環境は、
まず最初に、
mysql> CREATE DATABASE characters; Query OK, 1 row affected (0.00 sec) mysql> use characters Database changed
また、
CHAR型
CHAR型の特徴的な点は、
mysql> CREATE TABLE ch(c CHAR(4)) CHARACTER SET latin1; Query OK, 0 rows affected (0.03 sec)
また、
mysql> INSERT INTO ch(c) VALUES ('a b '); Query OK, 1 row affected (0.01 sec) mysql> INSERT INTO ch(c) VALUES ('a b'); Query OK, 1 row affected (0.01 sec)
続けて、
mysql> SELECT CONCAT('(',c,')') FROM ch; +-------------------+ | CONCAT('(',c,')') | +-------------------+ | (a b) | | (a b) | +-------------------+ 2 rows in set (0.00 sec)
上記の結果から、
CHAR型で指定できる長さ
CHAR型では、
mysql> CREATE TABLE ch2(c CHAR(0)) CHARACTER SET latin1; Query OK, 0 rows affected (0.01 sec) mysql> CREATE TABLE ch3(c CHAR(255)) CHARACTER SET latin1; Query OK, 0 rows affected (0.01 sec)
上のように、
mysql> CREATE TABLE ch4(c CHAR(256)) CHARACTER SET latin1; ERROR 1074 (42000): Column length too big for column 'c' (max = 255); use BLOB or TEXT instead
この型を使う際は、
SQLモードの違い
今回の説明では、
原因は、
5.
5.STRICT_
やSTRICT_
をSQLモードに指定することで、
mysql> INSERT INTO ch(c) VALUES ('abcde'); ERROR 1406 (22001): Data too long for column 'c' at row 1
参考までに、
mysql> INSERT INTO ch(c) VALUES ('abcde'); Query OK, 1 row affected, 1 warning (0.00 sec) mysql> select c from ch; +------+ | c | +------+ | abcd | +------+ 1 row in set (0.00 sec)
上記のように警告を出し、
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型の使い方について紹介をしました。名前が似ているにもかかわらず挙動がかなり違うので、