BINARY型とVARBINARY型

広告

ここでは文字列型の中でもBINARY型とVARBINARY型について確認していきます。

BINARY[(N)]
  固定長バイナリバイト文字列
  Nはバイトを指定。0から255文字
  別名:CHAR BYTE

VARBINARY(M)
  可変長バイナリバイト文字列
  Mはバイト数を指定。0から65535バイト

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

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

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

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

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

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

p5-1

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

p5-2

BYTE(5)型のカラムには「8E52」という値が格納されています。今回テストしている環境はクライアント側の文字コードがcp932、MySQLサーバ側がUTF8なのですが、クライアント側の文字セットであるcp932で"山"に対応するコードが「8E52」です。クライアントからは"山"という文字が「8E52」というデータがMySQLサーバへ送信されていますが、BINARY型のカラムに格納する時は、送られたきたデータをそのまま格納します。

それに対してCHAR(5)型のカラムには「E5B1B1」という値が格納されています。この「E5B1B1」はMySQLサーバ側の文字セットであるUTF8で"山"に対応するコードです。CHAR側のカラムに格納する時にクライアント側の文字セットからMySQLサーバ側の文字セットに変換された上で格納されています。

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

p5-3

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

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

BINARY型とBINARY属性の違い

CHAR型にBINARY属性を付けた場合は、あくまでカラムで使用される文字セットで文字列として保存されたデータを、その格納されている数値を使って比較したり並べ替えを行ったりします。

それに対してBINARY型の場合は、格納されているデータはバイナリデータであって文字列ではありません。その為、比較や並べ替えも格納されているデータの数値を使って行います。

どちらのデータ型が設定されているカラムに対して'a'と'A'を格納した場合、区別して比較されるという点では同じですが根本的な仕組みはまったく異なります。

( Written by Tatsuo Ikura )