BINARY
および
VARBINARY
型は、CHAR
および VARCHAR
型に似ていますが、非バイナリ列ではなく、バイナリ列を格納します。それは、それらが文字の文字列ではなく、バイトの文字列を含んでいるということです。これは、それらがキャラクタセットを持たず、ソートと比較は値の中の数値バイトに基づいているという意味です。
許容される最大長は、CHAR
と VARCHAR
と同様で、BINARY
と VARBINARY
の長さは文字ではなく長さのバイトであるという事以外、BINARY
と VARBINARY
と同じです。
BINARY
と
VARBINARY
データ型は CHAR BINARY
と VARCHAR BINARY
データ型とは異なります。後者の型は、BINARY
属性によってカラムがバイナリ列カラムとして扱われることはありません。その代わり、使用されるカラムのキャラクタセットに対してバイナリ照合を実行するため、カラム自体にはバイナリバイト列ではなく非バイナリ列が格納されます。たとえば、CHAR(5)
BINARY
は、デフォルトキャラクタセットが
latin1
だと仮定して、CHAR(5) CHARACTER
SET latin1 COLLATE latin1_bin
として扱われます。これは、キャラクタセットや照合を持たない
5 バイトのバイナリ列
BINARY(5)
とは異なります。非バイナリ列のバイナリ照合とバイナリ列の違いについては、The _bin
and binary
Collationsを参照してください。
厳密な SQL
モードが有効でない場合に、BINARY
または
VARBINARY
カラムにその最大長を超える値を割り当てると、その値はカラムの最大長に合わせて切り捨てられ、警告メッセージが表示されます。値を切り捨てる場合、厳密な
SQL
モードを使用することで、警告ではなくエラーを発生させて、その値の挿入を抑制することができます。Server SQL Modes
を参照してください。
BINARY
値が格納されるとき、特定の長さまでパッド値で右側が詰められます。パッド値は
0x00
です。(ゼロバイト) 値は挿入時には右側が
0x00
で詰められ、選択時に後続バイトは削除されません。すべてのバイトは、ORDER
BY
と DISTINCT
操作を含め、比較において重要です。0x00
バイトとスペースは比較において異なり、0x00
< スペースとなります。
例: BINARY(3)
カラムの場合、'a '
は挿入時に 'a \0'
となります。'a\0'
は挿入時に 'a\0\0'
となります。選択時、両方の値は変更されません。
VARBINARY
では、挿入時に詰められることも、選択時にバイトが削除されることもありません。すべてのバイトは、ORDER
BY
と DISTINCT
操作を含め、比較において重要です。0x00
バイトとスペースは比較において異なり、0x00
< スペースとなります。
後続パッドバイトが剥ぎ取られたり、比較がそれらを無視する場合は、もしカラムが固有の値を要求するインデックスを持っていたら、後続パッドバイトだけが異なるカラム値への挿入は重複キーエラーになります。たとえば、テーブルに
'a'
が含まれている場合、'a\0'
を格納しようとすると、重複キーエラーが発生します。
もしバイナリデータの格納に
BINARY
データ型を利用する予定で、検索した値を格納した値と同一にしたいなら、先行パッドと削除文字を注意深く検討する必要があります。次の例は、BINARY
値の 0x00
パッドがどのようにカラム値比較に影響するか、例を示しています。
mysql>CREATE TABLE t (c BINARY(3));
Query OK, 0 rows affected (0.01 sec) mysql>INSERT INTO t SET c = 'a';
Query OK, 1 row affected (0.01 sec) mysql>SELECT HEX(c), c = 'a', c = 'a\0\0' from t;
+--------+---------+-------------+ | HEX(c) | c = 'a' | c = 'a\0\0' | +--------+---------+-------------+ | 610000 | 0 | 1 | +--------+---------+-------------+ 1 row in set (0.09 sec)
もし検索した値がパッドなしの指定したストレージと同じ値でなければいけないなら、VARBINARY
か、BLOB
データ型の 1
つを代わりに利用するのが好ましいです。