MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  ...  /  ビット値リテラル

9.1.5 ビット値リテラル

ビット値リテラルは、b'val'または 0bval 表記を使用して書き込まれます。val は、ゼロとゼロを使用して書き込まれるバイナリ値です。 先行する b の大文字と小文字は関係ありません。 先頭の 0b では大/小文字が区別され、0B として書き込むことはできません。

有効なビット値リテラル:

b'01'
B'01'
0b01

不正なビット値リテラル:

b'2'    (2 is not a binary digit)
0B01    (0B must be written as 0b)

デフォルトでは、ビット値リテラルはバイナリ文字列です:

mysql> SELECT b'1000001', CHARSET(b'1000001');
+------------+---------------------+
| b'1000001' | CHARSET(b'1000001') |
+------------+---------------------+
| A          | binary              |
+------------+---------------------+
mysql> SELECT 0b1100001, CHARSET(0b1100001);
+-----------+--------------------+
| 0b1100001 | CHARSET(0b1100001) |
+-----------+--------------------+
| a         | binary             |
+-----------+--------------------+

ビット値リテラルには、オプションの文字セットイントロデューサおよび COLLATE 句を指定して、特定の文字セットおよび照合順序を使用する文字列として指定できます:

[_charset_name] b'val' [COLLATE collation_name]

例:

SELECT _latin1 b'1000001';
SELECT _utf8 0b1000001 COLLATE utf8_danish_ci;

この例では b'val'表記法を使用しますが、0bval 表記法ではイントロデューサも許可されています。 イントロデューサについては、セクション10.3.8「文字セットイントロデューサ」 を参照してください。

数値コンテキストでは、MySQL はビットリテラルを整数として扱います。 ビットリテラルの数値処理を保証するには、数値コンテキストで使用します。 これには、0 の追加または CAST(... AS UNSIGNED) の使用が含まれます。 たとえば、ユーザー定義変数に割り当てられるビットリテラルは、デフォルトでバイナリ文字列です。 値を数値として割り当てるには、数値コンテキストで使用します:

mysql> SET @v1 = b'1100001';
mysql> SET @v2 = b'1100001'+0;
mysql> SET @v3 = CAST(b'1100001' AS UNSIGNED);
mysql> SELECT @v1, @v2, @v3;
+------+------+------+
| @v1  | @v2  | @v3  |
+------+------+------+
| a    |   97 |   97 |
+------+------+------+

空のビット値 (b'') は、長さゼロのバイナリ文字列に評価されます。 数値に変換され、0 が生成されます:

mysql> SELECT CHARSET(b''), LENGTH(b'');
+--------------+-------------+
| CHARSET(b'') | LENGTH(b'') |
+--------------+-------------+
| binary       |           0 |
+--------------+-------------+
mysql> SELECT b''+0;
+-------+
| b''+0 |
+-------+
|     0 |
+-------+

ビット値表記は、BIT カラムに割り当てる値を指定する場合に便利です:

mysql> CREATE TABLE t (b BIT(8));
mysql> INSERT INTO t SET b = b'11111111';
mysql> INSERT INTO t SET b = b'1010';
mysql> INSERT INTO t SET b = b'0101';

結果セットのビット値はバイナリ値として返されますが、適切に表示されない場合があります。 ビット値を印刷可能な形式に変換するには、数値コンテキストで使用するか、BIN()HEX() などの変換関数を使用します。 変換された値に上位 0 桁は表示されません。

mysql> SELECT b+0, BIN(b), OCT(b), HEX(b) FROM t;
+------+----------+--------+--------+
| b+0  | BIN(b)   | OCT(b) | HEX(b) |
+------+----------+--------+--------+
|  255 | 11111111 | 377    | FF     |
|   10 | 1010     | 12     | A      |
|    5 | 101      | 5      | 5      |
+------+----------+--------+--------+

ビットリテラルの場合、ビット操作は数値コンテキストとみなされますが、ビット操作では MySQL 8.0 以上で数値またはバイナリ文字列引数が許可されます。 ビットリテラルのバイナリ文字列コンテキストを明示的に指定するには、少なくとも次のいずれかの引数に_binary イントロデューサを使用します:

mysql> SET @v1 = b'000010101' | b'000101010';
mysql> SET @v2 = _binary b'000010101' | _binary b'000101010';
mysql> SELECT HEX(@v1), HEX(@v2);
+----------+----------+
| HEX(@v1) | HEX(@v2) |
+----------+----------+
| 3F       | 003F     |
+----------+----------+

両方のビット操作で表示される結果は似ていますが、_binary のない結果は BIGINT 値ですが、_binary の結果はバイナリ文字列です。 結果タイプが異なるため、表示される値は異なります: 数値の結果には、上位 0 桁は表示されません。


関連キーワード:  リテラル, ビット, 数値, binary, バイナリ, リファレンス, CHARSET, コンテキスト, マニュアル, 表示