在SQL开发中,十六进制数据的转换是常见需求,比如存储二进制文件片段、处理加密后的字符串或者解析特殊编码的字段,HEX和UNHEX函数是实现这类转换的核心工具,不同数据库对这两个函数的支持略有差异,但核心逻辑一致。
HEX函数的作用与基本用法
HEX函数的作用是将字符串或者二进制数据转换为十六进制表示的字符串,转换后的每个字符对应原数据的两个十六进制位。在MySQL、MariaDB等数据库中,HEX函数可以直接接收字符串参数,返回对应的十六进制字符串。
以下是MySQL中使用HEX函数的基础示例:
-- 将普通字符串转换为十六进制
SELECT HEX('test') AS hex_result;
-- 输出结果:74657374
-- 将中文字符串转换为十六进制
SELECT HEX('测试') AS hex_result;
-- 输出结果:E6B58BE8AF95
在PostgreSQL中,没有直接的HEX函数,需要使用encode函数配合hex参数实现同样的效果:
-- PostgreSQL中将字符串转换为十六进制
SELECT encode('test'::bytea, 'hex') AS hex_result;
-- 输出结果:74657374
UNHEX函数的作用与基本用法
UNHEX函数是HEX的逆操作,用于将十六进制字符串转换回原始的字符串或者二进制数据。需要注意的是,传入UNHEX的字符串必须是合法的十六进制格式,否则会返回NULL或者报错。
MySQL中UNHEX函数的基础使用示例:
-- 将十六进制字符串转换回原始字符串
SELECT UNHEX('74657374') AS unhex_result;
-- 输出结果:test
-- 转换中文字符对应的十六进制
SELECT UNHEX('E6B58BE8AF95') AS unhex_result;
-- 输出结果:测试
如果传入的十六进制字符串长度不是偶数,或者包含非十六进制字符,UNHEX会返回NULL:
-- 非法十六进制字符串返回NULL
SELECT UNHEX('74g3') AS unhex_result;
-- 输出结果:NULL
PostgreSQL中对应的逆操作同样使用decode函数:
-- PostgreSQL中将十六进制转换回原始字符串
SELECT convert_from(decode('74657374', 'hex'), 'utf8') AS unhex_result;
-- 输出结果:test
常见应用场景
存储二进制数据
当需要在字符串类型的字段中存储二进制数据(比如文件片段、加密后的字节流)时,可以先用HEX函数将二进制转为十六进制字符串存储,读取时再用UNHEX转回原始数据,避免二进制数据中的特殊字符导致存储异常。
数据校验与调试
在调试过程中,如果需要查看字符串或者二进制字段的原始字节内容,可以用HEX函数输出十六进制表示,方便对比和分析数据是否正确。
跨系统数据交互
不同系统之间传递二进制数据时,将二进制转为十六进制字符串是通用的兼容方式,接收方拿到十六进制字符串后用UNHEX转回原始数据即可。
注意事项
- 十六进制字符串不区分大小写,HEX函数返回的通常是小写字母,UNHEX函数接收大写或小写十六进制字符串都可以正常处理。
- 转换中文等非ASCII字符时,需要注意原始字符串的编码格式,不同编码对应的十六进制结果不同,转换回原始数据时需要对应相同的编码,否则会出现乱码。
- 如果存储的十六进制字符串长度较长,需要保证目标字段的长度足够,避免转换后的字符串被截断。
不同数据库函数对比
以下是常见数据库中十六进制转换函数的对比:
| 数据库类型 | 转十六进制函数 | 转回原始数据函数 |
|---|---|---|
| MySQL/MariaDB | HEX(参数) | UNHEX(十六进制字符串) |
| PostgreSQL | encode(参数::bytea, 'hex') | convert_from(decode(十六进制字符串, 'hex'), 编码) |
| SQL Server | CONVERT(varchar(max), 参数, 2) | CONVERT(varbinary(max), 十六进制字符串, 2) |
SQL Server的示例代码如下:
-- SQL Server中转十六进制 SELECT CONVERT(varchar(max), 'test', 2) AS hex_result; -- 输出结果:74657374 -- SQL Server中转回原始数据 SELECT CONVERT(varchar(max), CONVERT(varbinary(max), '74657374', 2)) AS unhex_result; -- 输出结果:test