BINARY型とVARBINARY型

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

(Last modified: )

BINARY型とVARBINARY型について

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

BINARY(M)

固定長バイナリバイト文字列
M はバイト数。M の範囲は 0 から 255 。
格納時に必ず指定された長さになるように右側が 0x00 で埋められる。
別名:CHAR BYTE
VARBINARY(M)

可変長バイナリバイト文字列
M は最大バイト数。M の範囲は 0 から 65,535 。

BINARY 型と VARBINARY 型はデータをバイナリデータとして格納します。どちらのデータ型も文字セットなどはなく、送られてきたデータをそのままバイナリデータとして格納します。よって比較や照合もデータの数値をそのまま比較します。

BINARY 型に指定したバイト数よりも少ないデータを格納した場合には末尾に 0x00 を必要なだけ付け指定のバイト数になるように調整されてから格納されます。また取得した時にも 0x00 は削除されずに 0x00 が付いたまま取得されます。

VARBINARY 型は 0x00 が末尾に付けられることはありません。空白と 0x00 は異なりますのでデータの末尾に空白が合った場合も特別扱いされることはなく、空白に該当するコードはそのままバイナリデータとして格納されます。

バイナリデータがどのように格納されるか

バイナリデータとしてどのように格納されるのかを確認します。クライアントから BINARY 型が設定されたカラムに対してデータが追加された場合、追加される文字列をクライアント側で設定されている文字セットでコード化したデータが MySQL サーバ側に送信されます。送られてきたデータは MySQL 側のデフォルトの文字セットなどに関係無く変換されずにそのままコードとして格納されます。

例として BINARY(5) 型と CHAR(5) 型のカラムを持つテーブルを作成します。

create table strtest(str1 binary(5), str2 char(5) character set utf8);

バイナリデータがどのように格納されるか(1)

両方のカラムに同じ文字列を指定してデータを追加します。そして追加されたデータを16進数にして取得してみます。

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

バイナリデータがどのように格納されるか(2)

追加されたデータを 16 進数にして取得してみます。

select hex(str1), hex(str2) from strtest;

バイナリデータがどのように格納されるか(3)

BINARY 型のカラムには 8BF3 という値が格納されています。今回クライアント側の文字コードが cp932 となっており cp932 で '空' に対応するコードが 8BF3 です。クライアントからは 8BF3 というデータが MySQL サーバへ送信されていますが、 BINARY 型のカラムに格納する時は送られたきたデータをそのまま格納します。

CHAR 型のカラムには E7A9BA という値が格納されています。この E7A9BA はデータを格納するカラムに設定した文字セット UTF-8 で '空' に対応するコードです。 CHAR 側のカラムに格納する時にクライアント側の文字セットからカラムの文字セットに変換された上で格納されています。

では格納されているデータを取得してみます。

select * from strtest;

バイナリデータがどのように格納されるか(4)

BINARY 型のカラムの値は格納されたデータのままクライアントへ返します。送られてきたデータをクライアント側の文字セットで該当する文字に変換すると '空' になります。 CHAR 型のカラムの値はカラムの文字セットからクライアント側の文字セットに変換した上でクライアントへ返されます。よってこちらも '空' になります。

データを追加したクライアントの文字セットとデータを取得した文字セットがたまたま同じなので文字化けなどは起こりませんが、もし違っていた場合は文字化けする可能性があります。

-- --

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

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。