十六进制值
十六进制文字值使用或表示法书写,其中包含十六进制数字(,)。数字和任何前导字母的大小写无关紧要。标题区分大小写,不能写成。X'val'
0xval
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)
使用包含奇数位数的符号书写的值将被视为具有额外的前导。例如,被解释为。0xval
0
0x
0x0
默认情况下,十六进制文字是二进制字符串,其中每对十六进制数字代表一个字符:
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 _utf8 0x4D7953514CCOLLATE utf8_danish_ci;
这些示例使用符号,但是符号也允许介绍者。有关介绍人的信息,请参见“字符串字符集和校验规则”。X'val'
0xval
在数字上下文中,MySQL将十六进制文字视为BIGINT
(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 | +------- +
该表示法基于标准SQL。该表示法基于ODBC,ODBC通常使用十六进制字符串来提供列的值。X'val'
0x
BLOB
要将字符串或数字转换为十六进制格式的字符串,请使用以下HEX()
函数:
mysql>SELECT HEX('cat'); +------------ + | HEX('cat') | +------------ + | 636174 | +------------ + mysql>SELECT X'636174'; +----------- + | X'636174' | +----------- + | cat | +----------- +
对于十六进制文字,位操作被视为数字上下文,但是位操作允许在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位数。