MySQL 9.0 參考手冊  /  ...  /  十六進位字面值

11.1.4 十六進位字面值

十六進位字面值使用 X'val'0xval 表示法撰寫,其中 val 包含十六進位數字 (0..9A..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)

使用 0xval 表示法撰寫的值,若包含奇數個數字,則會被視為前面有一個額外的 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' 表示法,但 0xval 表示法也允許引入器。 有關引入器的資訊,請參閱 第 12.3.8 節,「字元集引入器」

在數值環境中,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'val' 表示法基於標準 SQL。 0x 表示法基於 ODBC,其中十六進位字串通常用於為 BLOB 資料行提供值。

若要將字串或數字轉換為十六進位格式的字串,請使用 HEX() 函式

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

對於十六進位字面值,位元運算被視為數值環境,但位元運算在 MySQL 9.0 及更高版本中允許數值或二進位字串引數。 若要明確指定十六進位字面值的二進位字串環境,請為至少一個引數使用 _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 數字不會顯示在數值結果中。