BINARY
および VARBINARY
型は、CHAR
および VARCHAR
型に似ていますが、非バイナリ文字列ではなく、バイナリ文字列を格納します。つまり、それらには文字の文字列ではなく、バイトの文字列が含まれています。これは、それらに文字セットがなく、ソートおよび比較は値の中のバイトの数値に基づいていることを意味します。
BINARY
および VARBINARY
で許可される最大長は、CHAR
および VARCHAR
の場合と同じですが、BINARY
および VARBINARY
の長さが文字数ではなくバイト数で表される点が異なります。
BINARY
および VARBINARY
データ型は CHAR BINARY
および VARCHAR BINARY
データ型とは異なります。後者の型は、BINARY
属性によってカラムがバイナリ文字列カラムとして扱われることはありません。その代わり、これによってカラムの文字セットのバイナリ照合順序が使用され、カラム自体にはバイナリバイト文字列ではなく非バイナリ文字列が格納されます。たとえば、CHAR(5) BINARY
は、デフォルト文字セットが latin1
とすれば、CHAR(5) CHARACTER SET latin1 COLLATE latin1_bin
として扱われます。これは、文字セットや照合順序を持たない 5 バイトのバイナリ文字列を格納する BINARY(5)
とは異なります。非バイナリ文字列のバイナリ照合順序とバイナリ文字列の違いについては、セクション10.1.7.6「_bin および binary 照合順序」を参照してください。
厳密な SQL モードが有効でない場合に、BINARY
または VARBINARY
カラムにその最大長を超える値を割り当てると、その値はカラムの最大長に合わせて切り捨てられ、警告メッセージが表示されます。値を切り捨てる場合、厳密な SQL モードを使用することで、警告ではなくエラーを発生させて、その値の挿入を抑制できます。セクション5.1.7「サーバー SQL モード」を参照してください。
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
データ型を使用することをお勧めします。