Mysql 十六进制字面量

来自泡泡学习笔记
BrainBs讨论 | 贡献2023年12月26日 (二) 09:41的版本 (创建页面,内容为“ 十六进制字面量值使用X’val’或0xval表示法编写,其中val包含十六进制数字(0..9,A..F)。字母的大小写和任何前导X都无关紧要。前导0x是区分大小写的,不能写成0X。 <br> 合法的十六进制字面量: <pre>X'01AF' X'01af' x'01AF' x'01af' 0x01AF 0x01af</pre> <br> 非法的十六进制字面量: <pre>X'0G' (G不是十六进制数字) 0X01AF (0X必须写成0x)</pre> <br> 使用X’val’表示…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

十六进制字面量值使用X’val’或0xval表示法编写,其中val包含十六进制数字(0..9,A..F)。字母的大小写和任何前导X都无关紧要。前导0x是区分大小写的,不能写成0X。


合法的十六进制字面量:

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


非法的十六进制字面量:

X'0G'   (G不是十六进制数字)
0X01AF  (0X必须写成0x)


使用X’val’表示法的值必须包含偶数个数字,否则会出现语法错误。要解决此问题,请在值前添加一个前导零:

mysql> SET @s = X'FFF';
ERROR 1064 (42000): 您的SQL语法有误;请参阅与您的MySQL服务器版本对应的手册以获取正确的语法。

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表示法也可以引入器。


在数值上下文中,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。ODBC的0x表示法基于ODBC,对于BLOB列,通常使用十六进制字符串来提供值。

要将字符串或数字转换为十六进制格式的字符串,请使用HEX()函数:

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


对于十六进制字面量,位操作被视为数值上下文,但在MySQL 8.0及更高版本中,位操作允许在MySQL 8.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位未显示在数值结果中。