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 型や VARBINARY 型が設定されたカラムに対してデータが追加された場合、追加される文字列をクライアント側で設定されている文字セットでコード化したデータが MySQL サーバ側に送信されます。送られてきたデータは MySQL 側のデフォルトの文字セットなどに関係無く変換されずにそのままコードとして格納されます。

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

create table binarytest(str1 binary(5), str2 varbinary(5), str3 char(5));

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

すべてのカラムに同じ文字列を指定してデータを追加します。

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

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

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

select hex(str1), hex(str2), hex(str3) from binarytest;

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

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

また BINARY 型のカラムはバイト数 5 バイトと指定されています。今回格納するデータは 5 バイトよりも少ないため、 5 バイトになるように末尾に必要なだけ 0x00 が追加されています。

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

-- --

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

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

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