导读:本期聚焦于重启一下创作的《SQL中如何对十六进制数据进行转换?HEX与UNHEX函数怎么用》,敬请观看详情。在SQL开发过程中,我们经常会遇到需要处理十六进制数据的场景,比如存储二进制数据、解析加密后的字符串或者处理特殊编码的内容。很多开发者不清楚怎么在SQL里完成十六进制和其他格式的转换,HEX和UNHEX是两个常用的内置函数,能快速实现这类需求。本文将详细介绍这两个函数的基本用法、适用场景、注意事项,还会结合具体的代码示例说明不同数据库下的使用差异,帮助开发者快速掌握十六进制数据的转换方法,解决实际开发中的数据格式处理问题。

在SQL开发中,十六进制数据的转换是一项基础且常用的操作。无论是存储二进制文件片段、处理加密后的字节流,还是解析某些特殊编码字段,开发人员都经常需要将原始字符串或二进制数据转换为十六进制表示,或者将十六进制字符串还原为原始数据。在MySQL、MariaDB等数据库中,HEXUNHEX两个函数专门用于完成这一任务;而在PostgreSQL、SQL Server等系统中,虽然函数名称不同,但转换思路完全一致。

HEX函数的作用与基本用法

HEX函数的核心作用是将字符串或二进制数据转换为十六进制字符串。转换后的结果中,原始数据每个字节会被表示为两个十六进制字符,因此字符串和十六进制结果之间存在一一对应关系。例如,英文字符test的UTF-8编码为四个字节,对应的十六进制结果就是74657374。对于中文等多字节字符,HEX函数同样按照底层字节进行转换,而不会直接转换字符本身。

在MySQL和MariaDB中,HEX函数的语法非常简洁,直接向函数传入字符串参数即可。下面的示例展示了普通字符串和中文字符串的转换过程:

-- 将普通字符串转换为十六进制
SELECT HEX('test') AS hex_result;
-- 输出结果:74657374

-- 将中文字符串转换为十六进制
SELECT HEX('测试') AS hex_result;
-- 输出结果:E6B58BE8AF95

PostgreSQL并不提供名为HEX的内置函数,但可以通过组合encode函数与bytea类型来实现相同效果。bytea是PostgreSQL中用于表示二进制数据的类型,encode函数的第二个参数指定编码格式,传入hex即可输出十六进制字符串。这种写法虽然稍显冗长,但同样能够覆盖HEX函数的全部常见用途。

-- PostgreSQL中将字符串转换为十六进制
SELECT encode('test'::bytea, 'hex') AS hex_result;
-- 输出结果:74657374

UNHEX函数的作用与基本用法

UNHEX函数可以理解为HEX函数的逆操作,它接收一个合法的十六进制字符串,将其还原为原始字符串或二进制数据。使用UNHEX时必须确保输入字符串的格式正确,例如只包含0到9以及A到F的字符,并且长度通常为偶数。如果输入包含非法字符或长度不符合要求,MySQL会返回NULL,而PostgreSQL等数据库则可能直接抛出错误。

MySQL中UNHEX函数的使用方式如下:

-- 将十六进制字符串转换回原始字符串
SELECT UNHEX('74657374') AS unhex_result;
-- 输出结果:test

-- 转换中文字符对应的十六进制
SELECT UNHEX('E6B58BE8AF95') AS unhex_result;
-- 输出结果:测试

下面的示例展示了传入非法十六进制字符串时的行为。需要注意,不同数据库对非法输入的处理策略并不完全一致,因此在实际开发中应在转换前进行必要的格式校验。

-- 非法十六进制字符串返回NULL
SELECT UNHEX('74g3') AS unhex_result;
-- 输出结果:NULL

在PostgreSQL中,十六进制转回原始数据通常需要decode函数和convert_from函数配合完成。decode函数负责将十六进制字符串解析为二进制数据,convert_from函数则将二进制数据按指定编码转换为文本。如果原始数据是UTF-8编码,第二个参数应写为utf8

-- PostgreSQL中将十六进制转换回原始字符串
SELECT convert_from(decode('74657374', 'hex'), 'utf8') AS unhex_result;
-- 输出结果:test

常见应用场景与实践要点

十六进制转换在实际项目中有着广泛的应用。第一个典型场景是二进制数据存储。很多业务系统需要将文件片段、签名摘要或加密后的字节流保存到数据库的字符串字段中。由于二进制数据可能包含控制字符或特殊字节,直接存储容易引发编码异常或字段截断。此时可以先用HEX函数将二进制转换为十六进制字符串,读取时再用UNHEX还原,从而安全地完成存储与读取。

第二个常见场景是数据校验与调试。当开发人员需要确认某段字符串或二进制字段的原始字节内容时,直接查看可能无法发现隐藏字符或编码差异。使用HEX函数输出十六进制表示,可以清晰看到每个字节的值,便于比对和定位问题。第三个场景是跨系统数据交互。不同系统之间传输二进制数据时,将数据转换为十六进制字符串是一种广泛兼容的做法。接收方拿到十六进制字符串后,只需使用对应平台的转换函数还原即可,无需关心底层二进制格式差异。

在实际使用HEXUNHEX时,还需要注意以下几点:

  • 十六进制字符串不区分大小写,HEX函数通常返回小写字母,但UNHEX函数接收大写或小写输入均可正常处理。
  • 转换中文等非ASCII字符时,必须关注原始字符串的编码格式。UTF-8、GBK等编码对同一字符会产生不同的十六进制结果,还原时也必须使用相同编码,否则会出现乱码。
  • 如果转换后的十六进制字符串较长,应确保目标字段长度足够,避免存储时被截断。

不同数据库函数差异与示例

虽然HEXUNHEX在MySQL、MariaDB中最为常见,但其他数据库也有对应的替代函数。为了便于统一理解,下表列出了几种主流数据库的十六进制转换方案:

数据库类型转十六进制函数转回原始数据函数
MySQL/MariaDBHEX(参数)UNHEX(十六进制字符串)
PostgreSQLencode(参数::bytea, 'hex')convert_from(decode(十六进制字符串, 'hex'), 编码)
SQL ServerCONVERT(varchar(max), 参数, 2)CONVERT(varbinary(max), 十六进制字符串, 2)

SQL Server的转换方式与MySQL、PostgreSQL均不相同。SQL Server使用CONVERT函数并指定风格参数为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

需要注意的是,SQL Server在将十六进制字符串转回文本时,需要经过两次CONVERT调用。第一次将十六进制字符串转换为varbinary类型,第二次将varbinary类型转换为varchar类型。如果省略第二次转换,查询结果将显示为二进制格式,而不是可读文本。

总结与使用建议

总体来看,HEXUNHEX函数为SQL开发中的十六进制转换提供了清晰高效的解决方案。在MySQL、MariaDB中可以直接使用这两个函数;在PostgreSQL中需要借助encodedecode以及convert_from函数组合;在SQL Server中则通过CONVERT函数指定风格参数2完成转换。虽然函数名称和调用方式不同,但底层逻辑一致,即按照字节进行编码与解码。

开发人员在使用这些函数时,应重点注意输入格式的合法性与编码格式的一致性。非法十六进制字符串可能导致NULL或异常,而编码不一致则会造成数据乱码。对于需要临时存储二进制数据的场景,建议在应用层与数据库层之间统一约定十六进制字符串的格式,并尽量使用固定编码进行转换,以降低维护成本。

掌握这些函数的用法之后,处理二进制存储、调试分析和跨系统数据交互等需求时会更加得心应手。建议读者结合自身所用数据库的类型,选择最合适的函数组合,并在实际项目中验证转换结果是否符合预期。

SQLHEX函数UNHEX函数十六进制转换修改时间:2026-07-15 00:09:31

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。