Mysql 十六进制字面量
十六进制字面量值使用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位未显示在数值结果中。