十六進位字面值使用 X'
或 val
'0x
表示法撰寫,其中 val
val
包含十六進位數字 (0..9
、A..F
)。數字與任何開頭 X
的字母大小寫並不重要。開頭的 0x
區分大小寫,且不能寫成 0X
。
合法的十六進位字面值
X'01AF'
X'01af'
x'01AF'
x'01af'
0x01AF
0x01af
不合法的十六進位字面值
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
。
預設情況下,十六進位字面值是二進位字串,其中每對十六進位數字代表一個字元
mysql> SELECT X'4D7953514C', CHARSET(X'4D7953514C');
+---------------+------------------------+
| X'4D7953514C' | CHARSET(X'4D7953514C') |
+---------------+------------------------+
| MySQL | binary |
+---------------+------------------------+
mysql> SELECT 0x5461626c65, CHARSET(0x5461626c65);
+--------------+-----------------------+
| 0x5461626c65 | CHARSET(0x5461626c65) |
+--------------+-----------------------+
| Table | binary |
+--------------+-----------------------+
十六進位字面值可能會有選擇性的字元集引介子和 COLLATE
子句,以將其指定為使用特定字元集和排序規則的字串
[_charset_name] X'val' [COLLATE collation_name]
範例
SELECT _latin1 X'4D7953514C';
SELECT _utf8mb4 0x4D7953514C COLLATE utf8mb4_danish_ci;
這些範例使用 X'
表示法,但 val
'0x
表示法也允許引介子。如需引介子的資訊,請參閱第 12.3.8 節「字元集引介子」。val
在數值上下文中,MySQL 會將十六進位字面值視為 BIGINT UNSIGNED
(64 位元無號整數)。若要確保將十六進位字面值視為數值,請在數值上下文中使用它。執行此操作的方法包括加上 0 或使用 CAST(... AS UNSIGNED)
。例如,指派給使用者定義變數的十六進位字面值預設為二進位字串。若要將值指派為數字,請在數值上下文中使用它
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 |
+------+------+------+
空的十六進位值 (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
欄位提供值。
若要將字串或數字轉換為十六進位格式的字串,請使用 HEX()
函式
mysql> SELECT HEX('cat');
+------------+
| HEX('cat') |
+------------+
| 636174 |
+------------+
mysql> SELECT X'636174';
+-----------+
| X'636174' |
+-----------+
| cat |
+-----------+
對於十六進位字面值,位元運算會被視為數值上下文,但位元運算允許在 MySQL 8.4 及更高版本中使用數值或二進位字串引數。若要明確指定十六進位字面值的二進位字串上下文,請針對至少一個引數使用 _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 數字。