- Home ›
- MySQLの使い方 ›
- MySQLのデータ型 ›
- HERE
CHAR型とVARCHAR型
ここでは文字列型の中でもCHAR型とVARCHAR型について確認していきます。
CHAR(M) 固定長文字列 Mは文字数を指定。0から255文字 別名:CHAR(M)はCHARACTER(M)の別名 VARCHAR(M) 可変長文字列 Mはバイト数を指定。0から65535バイト 別名:VARCHAR(M)はCHARACTER VARYING(M)の別名
CHAR型は指定した文字数以下の文字を格納した場合には文字列の末尾に空白を必要なだけ付け加えて指定の長さの文字列として格納します。ただし値を取得する場合は末尾にある空白は全て削除された上で取得されますし比較される時も同様です。
それに対してVARCHAR型は末尾に空白を付けるようなことはしません。また現行のバージョンでは末尾に空白がある文字列であっても空白が付いたまま格納されます。取得する時も空白付きで取得しますが、WHERE句で比較する時だけ末尾の空白を削除した上で比較されます。
それではCHAR(5)型のカラムとVARCHAR(5)型のカラムを持つテーブルを作成してみます。
ではデータを追加した後でテーブルのデータを取得してみます。
CHAR(5)型は常に5文字の長さになるように空白を使って足りない分を埋めて格納されますが、格納されたデータを取得すると文字列の末尾に付いている空白は削除された上で取得されます。よって今回の場合は同じ結果を取得します。
では今度は各カラムに格納する文字列の最後に空白を加えたデータを追加してみます。
MySQL5.1ではVARCHAR型のカラムに末尾に空白を含む文字列を格納しても末尾の空白は削除されずに格納されます。CHAR型の場合は取得する時に末尾についた空白は削除された上で取得されますが、VARCHAR型の場合は取得する時に末尾についた空白はそのまま取得します。
ただしVARCHAR型のカラムに格納された値であっても、WHERE句で比較する場合は末尾の空白を削除した上で比較されますので注意して下さい。
文字セットと照合順序
CHAR型とVARCHAR型はそれぞれ文字セットと照合順序を指定することができます。使い方は次の通りです。
CHAR(M) [CHARACTER SET 文字セット] [COLLATE 照合順序]
VARCHAR(M) [CHARACTER SET 文字セット] [COLLATE 照合順序]
MySQLにはデータベース、テーブル、カラム、文字列リテラルの4つのレベルで文字セットを設定することができます。文字列のデータ型に文字セットを指定した場合、そのデータ型を指定したカラムに対して文字セットを指定することになります。
MySQLに設定可能な文字セットは次のSQL文を実行すると取得できます。
mysql> show character set;
またある文字セットに対して指定可能な照合順序は次のように取得できます。(下記はcp932の対する照合順序です)。
mysql> show collation like 'cp932%';
それではCHAR(5)型のカラムとCHAR(5) CHARACTER SET cp932型のカラムを持つテーブルを作成してみます。
作成したテーブル定義を確認してみます。
カラムに対して文字セットが定義されていることが確認できます。
ASCII属性/UNICODE属性/BINARY属性
データ型に対してASCII属性を設定するとCHARACTER SET latin1を設定した場合と同じです。
CHAR(M) ASCII CHAR(M) CHARACTER SET latin1
データ型に対してUNICODE属性を設定するとCHARACTER SET ucs2 を設定した場合と同じです。
CHAR(M) UNICODE CHAR(M) CHARACTER SET ucs2
データ型に対してBINARY属性を設定すると比較や照合の時にバイナリデータとして比較されます。つまりCOLLATEがバイナリのものに設定されます。
CHAR(M) BINARY CHAR(M) CHARACTER SET utf8 COLLATE utf8_bin
※ 上記はデフォルトの文字セットがUTF8の場合です。CHARACTER SETを合わせて指定することもできます。
MySQLでは文字列の値を比較する時に大文字と小文字を区別しません。BINARY属性を設定するとバイナリデータとして比較されますので'A'と'a'は区別されます。
それではCHAR(5) ASCII型のカラムとCHAR(5) UNICODE型とCHAR(5) BINARY型のカラムを持つテーブルを作成しテーブル定義を確認してみます。
各属性を指定した場合に実際にどのようなデータ型として作成されているのか確認できると思います。
( Written by Tatsuo Ikura )