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


MySQL 8.0 リファレンスマニュアル  /  ...  /  16 進数リテラル

9.1.4 16 進数リテラル

16 進数リテラル値は、X'val'または 0xval 表記を使用して書き込まれます。val には 16 進数の桁 (0..9A..F) が含まれます。 数字および先行する X の大文字と小文字は関係ありません。 先頭の 0x では大/小文字が区別され、0X として書き込むことはできません。

有効な 16 進数リテラル:

X'01AF'
X'01af'
x'01AF'
x'01af'
0x01AF
0x01af

不正な 16 進数リテラル:

X'0G'   (G is not a hexadecimal digit)
0X01AF  (0X must be written as 0x)

X'val'表記法を使用して記述された値には偶数の桁数が含まれている必要があり、含まれていない場合は構文エラーが発生します。 問題を修正するには、値の先頭にゼロを埋め込みます:

mysql> SET @s = X'FFF';
ERROR 1064 (42000): You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server
version for the right syntax to use near 'X'FFF''

mysql> SET @s = X'0FFF';
Query OK, 0 rows affected (0.00 sec)

奇数桁を含む 0xval 表記を使用して記述された値は、余分な先行 0 を持つものとして扱われます。 たとえば、0xaaa0x0aaa として解釈されます。

デフォルトでは、16 進数リテラルはバイナリ文字列で、16 進数の各ペアは文字を表します:

mysql> SELECT X'4D7953514C', CHARSET(X'4D7953514C');
+---------------+------------------------+
| X'4D7953514C' | CHARSET(X'4D7953514C') |
+---------------+------------------------+
| MySQL         | binary                 |
+---------------+------------------------+
mysql> SELECT 0x5461626c65, CHARSET(0x5461626c65);
+--------------+-----------------------+
| 0x5461626c65 | CHARSET(0x5461626c65) |
+--------------+-----------------------+
| Table        | binary                |
+--------------+-----------------------+

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

[_charset_name] X'val' [COLLATE collation_name]

例:

SELECT _latin1 X'4D7953514C';
SELECT _utf8 0x4D7953514C COLLATE utf8_danish_ci;

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

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

mysql> SET @v1 = X'41';
mysql> SET @v2 = X'41'+0;
mysql> SET @v3 = CAST(X'41' AS UNSIGNED);
mysql> SELECT @v1, @v2, @v3;
+------+------+------+
| @v1  | @v2  | @v3  |
+------+------+------+
| A    |   65 |   65 |
+------+------+------+

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

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

X'val'表記は標準 SQL に基づいています。 0x 表記は ODBC に基づいており、BLOB カラムの値を指定するために 16 進数文字列がよく使用されます。

文字列または数値を 16 進数形式の文字列に変換するには、HEX() 関数を使用します:

mysql> SELECT HEX('cat');
+------------+
| HEX('cat') |
+------------+
| 636174     |
+------------+
mysql> SELECT X'636174';
+-----------+
| X'636174' |
+-----------+
| cat       |
+-----------+

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

mysql> SET @v1 = X'000D' | X'0BC0';
mysql> SET @v2 = _binary X'000D' | X'0BC0';
mysql> SELECT HEX(@v1), HEX(@v2);
+----------+----------+
| HEX(@v1) | HEX(@v2) |
+----------+----------+
| BCD      | 0BCD     |
+----------+----------+

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


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