MySQL 文字列最大長の設定について
この記事はアンテクアドベントカレンダー2022の5日目の記事です。
https://adventar.org/calendars/7821
皆さんこんにちは、サーバーサイドエンジニアの大川です。今回はMySQLのCHAR型やVARCHAR型の文字列系データ型の最大長の設定について簡単にまとめてみようと思います!
文字列最大長の設定
CHAR型やVARCHAR型は文字列最大長の設定をする事ができます。
現在のMySQLの文字列カラムの文字列最大長の指定はバイト数ではなく文字数で指定します。(古いMySQLバージョンではバイト数指定)実際にテーブルにカラムを用意して振る舞いを見てみましょう!
体験
下記のSQLを実行してテスト用DBとテスト用テーブル・カラムを作成します。
create database string_test;
use string_test;
create table char_varchars(char_str char(10), varchar_str varchar(10));
上記SQLを実行すると下記のカラムが作成されます。
+-------------+-------------+--------------------+------+-----+---------+-------+---------------------------------+---------+
| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |
+-------------+-------------+--------------------+------+-----+---------+-------+---------------------------------+---------+
| char_str | char(10) | utf8mb4_0900_ai_ci | YES | | NULL | | select,insert,update,references | |
| varchar_str | varchar(10) | utf8mb4_0900_ai_ci | YES | | NULL | | select,insert,update,references | |
+-------------+-------------+--------------------+------+-----+---------+-------+---------------------------------+---------+
上記のTypeを見るとchar型とvarchar型それぞれ文字コードutf8mb4で10文字の文字列最大長指定がされています。
insertできないことを前提にchar_strとvarchar_strカラムにそれぞれ「これはテスト文字列です」という11文字のinsertを試みてみましょう。
文字列最大長を超えているのでもちろんエラーになります。
mysql> insert into char_varchars (char_str) values ('これはテスト文字列です');
ERROR 1406 (22001): Data too long for column 'char_str' at row 1
mysql> insert into char_varchars (varchar_str) values ('これはテスト文字列です');
ERROR 1406 (22001): Data too long for column 'varchar_str' at row 1
では、char_strとvarchar_strカラムにそれぞれ「これはテスト文字列」という9文字のinsertをしてみましょう。
mysql> insert into char_varchars (char_str) values ('これはテスト文字列');
Query OK, 1 row affected (0.02 sec)
mysql> insert into char_varchars (varchar_str) values ('これはテスト文字列');
Query OK, 1 row affected (0.00 sec)
もちろん文字列最大長以下(9文字)なので値を格納する事ができます。テーブルで確認しても下記の様に値が入っています。
+-----------------------------+-----------------------------+
| char_str | varchar_str |
+-----------------------------+-----------------------------+
| これはテスト文字列 | NULL |
| NULL | これはテスト文字列 |
+-----------------------------+-----------------------------+
日本語は2バイト以上なので日本語で9文字 = 18バイト以上ということになります。今回char(10)とvarchar(10)と指定しても18バイト以上の文字列が格納できるのは、MySQLが文字コードを加味して文字数を用いた文字列最大長の指定ができるおかげということになります!