16 進数リテラル値は、X'
または val
'0x
表記を使用して書き込まれます。val
val
には 16 進数の桁 (0..9
、A..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)
奇数桁を含む 0x
表記を使用して記述された値は、余分な先行 val
0
を持つものとして扱われます。 たとえば、0xaaa
は 0x0aaa
として解釈されます。
デフォルトでは、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
'0x
表記法ではイントロデューサも許可されています。 イントロデューサについては、セクション10.3.8「文字セットイントロデューサ」 を参照してください。
val
数値コンテキストでは、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'
表記は標準 SQL に基づいています。 val
'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 桁は表示されません。