CHAR型とVARCHAR型

MySQL で利用可能なデータ型の中で文字列型の CHAR 型と VARCHAR 型の使い方について解説します。

(Last modified: )

CHAR型とVARCHAR型について

文字列型の中でも CHAR 型と VARCHAR 型は次のようなデータ型です。

CHAR[(M)] [CHARACTER SET charset_name] [COLLATE collation_name]
固定長文字列
M は文字数。M の範囲は 0 から 255 。省略すると、長さは 1 。
格納時に必ず指定された長さになるように右側がスペースで埋められる。
別名:CHARACTER
VARCHAR(M) [CHARACTER SET charset_name] [COLLATE collation_name]

可変長文字列
M は最大文字数。M の範囲は 0 から 65,535 。
ただし使用する文字コードで使うバイト数による。
別名:CHARACTER VARYING

CHAR 型は指定した文字数以下の文字を格納した場合には文字列の末尾に空白を必要なだけ付け加えて指定の長さの文字列として格納します。ただし値を取得する場合は末尾にある空白は全て削除された上で取得されます。比較される時も同じです。

VARCHAR 型は末尾に空白を付けるようなことはしません。また現行のバージョンでは末尾に空白がある文字列であっても空白が付いたまま格納されます。取得する時も空白付きで取得しますが、 WHERE 句で比較する時だけ末尾の空白を削除した上で比較されます。

それでは文字数を 5 に指定した CHAR(5) 型のカラムと最大文字数を 5 に指定した VARCHAR(5) 型のカラムを持つテーブルを作成してみます。

create table strtest(str1 char(5), str2 varchar(5));

CHAR型とVARCHAR型について(1)

次のようなデータを追加します。

insert into strtest values('abc', 'abc');

insert into strtest values('abc ', 'abc ');

CHAR型とVARCHAR型について(2)

テーブルからデータを取得します。どこからどこまでが取得したデータか分かりやすいように concat 関数を使って取得した値の前後に '(' と')' を付けています。

select concat('(', str1, ')'), concat('(', str2, ')') from strtest;

CHAR型とVARCHAR型について(3)

CHAR(5) 型は常に5文字の長さになるように空白を使って足りない分を埋めて格納されますが、格納されたデータを取得すると文字列の末尾に付いている空白は削除された上で取得されます。よって SELECT 文で取得した値には空白は含まれません。

VARCHAR(5) 型のカラムに末尾に空白を含む文字列を格納すると末尾の空白は削除されずに格納されます。取得する時に末尾についた空白はそのまま取得するので SELECT 文で取得した値には空白が含まれます。

指定した最大文字数を超える値を格納する

CHAR 型で指定した文字数と VARCHAR 型で指定した最大文字数を超える値を格納しようとするとそれぞれエラーとなります。先ほど作成したテーブルでは CHAR 型のカラムの文字数を 5 、 VARCHAR 型のカラムの最大文字数を 5 に設定していました。

create table strtest(str1 char(5), str2 varchar(5));

指定した最大文字数を超える値を格納する(1)

それぞれのカラムに例えば 7 文字の値を追加しようとすると CHAR 型であっても VARCHAR 型であっても Data too long for column 'カラム名' というエラーが発生します。

insert into strtest(str1) values('abcdefg');

insert into strtest(str2) values('abcdefg');

指定した最大文字数を超える値を格納する(2)

文字セットと照合順序を指定する

CHAR 型と VARCHAR 型はそれぞれ文字セットと照合順序を指定することができます。使い方は次の通りです。

CHAR(M) [CHARACTER SET 文字セット] [COLLATE 照合順序]

VARCHAR(M) [CHARACTER SET 文字セット] [COLLATE 照合順序]

MySQL ではデータベース、テーブル、カラム、文字列リテラルの4つのレベルで文字セットを設定することができます。文字列のデータ型に文字セットを指定した場合、そのデータ型を指定したカラムに対して文字セットを指定することになります。

MySQL に設定可能な文字セットを取得する方法は「MySQLで設定可能な文字コードの一覧」を参照されてください。主な文字セットは次の通りです。

CharsetDescriptionDefault collationMaxlen
binaryBinary pseudo charsetbinary1
cp932SJIS for Windows Japanesecp932_japanese_ci2
eucjpmsUJIS for Windows Japaneseeucjpms_japanese_ci3
latin1cp1252 West Europeanlatin1_swedish_ci1
sjisShift-JIS Japanesesjis_japanese_ci2
ujisEUC-JP Japaneseujis_japanese_ci3
utf8mb4UTF-8 Unicodeutf8mb4_0900_ai_ci4

また文字セット毎に設定可能な照合順序を取得する方法は「文字コードと照合順序」を参照されてください。主な文字セットは次の通りです。

-- --

テーブルを作成する時にカラムに文字セットを指定しなかった場合、接続しているデータベースを作成する時に指定されたデフォルトの文字セットと照合順序がカラムに設定されます。先ほど作成したテーブルがどのように作成されたのかを確認してみます。

show create table strtest\G

文字セットと照合順序を指定する(1)

テーブルを作成する時に文字セットを指定しないので DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci が自動で指定されており、テーブルのカラムは特に指定しなかった場合文字セットが utf8mb4 で 照合順序が utf8mb4_0900_ai_ci となります。

※ テーブルのデフォルトの文字セットが utf8mb4 なのは、データベースを作成する時にデフォルトの文字セットとして utf8mb4 を使用するように my.ini ファイルで設定されているためです。

-- --

それでは文字セットとして cp932 を使用する CHAR 型のカラムと VARCHAR 型のカラムを持つテーブルを作成してみます。また VARCHAR 型のカラムは照合順序として cp932_bin を指定します。

create table strtest(str1 char(5) character set cp932, str2 varchar(5) character set cp932 collate cp932_bin);

文字セットと照合順序を指定する(2)

作成したテーブルがどのように作成されたのかを確認してみます。

show create table strtest\G

文字セットと照合順序を指定する(3)

CHAR 型のカラムには文字セットとして cp932 が設定されています。照合順序を指定していないので、このカラムの照合順序は cp932 のデフォルトの照合順序である cp932_japanese_ci となっています。

VARCHAR 型のカラムには文字セットとして cp932 が設定されています。また照合順序として cp932_bin を指定したのでこのカラムの照合順序は cp932_bin となっています。

このようにカラムに指定した文字セットおよび照合順序が設定されていることが確認できます。

-- --

MySQL で利用可能なデータ型の中で文字列型の CHAR 型と VARCHAR 型の使い方について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。