UNHEX
描述
UNHEX 函数用于将十六进制字符串转换为原始字符串,是 HEX 函数的逆操作。该函数将每两个十六进制字符(0-9, A-F, a-f)转换为一个字节。UNHEX_NULL 函数功能相同,但在遇到无效输入时返回 NULL 而不是空字符串。这两个函数在处理二进制数据、加密数据或需要十六进制表示的数据时非常有用。
提示
该函数自 3.0.6 版本开始支持
语法
UNHEX(<str>)
UNHEX_NULL(<str>)
参数
| 参数 | 说明 |
|---|---|
<str> | 需要解码的十六进制字符串。类型:VARCHAR |
返回值
返回 VARCHAR 类型,表示十六进制解码后的原始字符串。
解码规则:
- 接受字符范围:0-9, a-f, A-F
- 每两个十六进制字符转换为一个字节
- 结果可能包含不可打印字符
特殊情况(UNHEX):
- 如果输入为 NULL,返回空字符串
- 如果字符串长度为 0 或奇数,返回空字符串
- 如果包含非十六进制字符,返回空字符串
特殊情况(UNHEX_NULL):
- 如果输入为 NULL,返回 NULL
- 如果字符串长度为 0 或奇数,返回 NULL
- 如果包含非十六进制字符,返回 NULL
示例
- 基本十六进制解码
SELECT UNHEX('41'), UNHEX('61');
+-------------+-------------+
| UNHEX('41') | UNHEX('61') |
+-------------+-------------+
| A | a |
+-------------+-------------+
- 多字符解码
SELECT UNHEX('4142'), UNHEX('48656C6C6F');
+---------------+----------------------+
| UNHEX('4142') | UNHEX('48656C6C6F') |
+---------------+----------------------+
| AB | Hello |
+---------------+----------------------+
- NULL 值处理(两个函数对比)
SELECT UNHEX(NULL), UNHEX_NULL(NULL);
+-------------+-----------------+
| UNHEX(NULL) | UNHEX_NULL(NULL) |
+-------------+-----------------+
| | NULL |
+-------------+-----------------+
- 空字符串处理
SELECT UNHEX(''), UNHEX_NULL('');
+-----------+-----------------+
| UNHEX('') | UNHEX_NULL('') |
+-----------+-----------------+
| | NULL |
+-----------+-----------------+
- 非法字符处理
SELECT UNHEX('@'), UNHEX_NULL('@');
+------------+-----------------+
| UNHEX('@') | UNHEX_NULL('@') |
+------------+-----------------+
| | NULL |
+------------+-----------------+
- 奇数长度字符串
SELECT UNHEX('123'), UNHEX_NULL('123');
+--------------+-------------------+
| UNHEX('123') | UNHEX_NULL('123') |
+--------------+-------------------+
| | NULL |
+--------------+-------------------+
- UTF-8 字符解码
SELECT UNHEX('E4B8AD'), UNHEX('E69687');
+-----------------+-----------------+
| UNHEX('E4B8AD') | UNHEX('E69687') |
+-----------------+-----------------+
| 中 | 文 |
+-----------------+-----------------+
- 数字编码解码
SELECT UNHEX('313233'), UNHEX('393837');
+------------------+------------------+
| UNHEX('313233') | UNHEX('393837') |
+------------------+------------------+
| 123 | 987 |
+------------------+------------------+
- 十六进制编码解码循环验证
SELECT UNHEX(HEX('Hello')), UNHEX(HEX('Test123'));
+---------------------+------------------------+
| UNHEX(HEX('Hello')) | UNHEX(HEX('Test123')) |
+---------------------+------------------------+
| Hello | Test123 |
+---------------------+------------------------+