CONV()是MySQL中十六进制转十进制最直接可靠的方法,但需注意参数顺序(字符串、源进制、目标进制)、去除0x前缀、清理空白字符、校验合法性、处理返回字符串类型及空值等问题。

CONV() 是 MySQL 中最直接、最可靠的十六进制转十进制方法,无需额外函数或字符串拼接,但必须注意参数顺序和类型隐式转换陷阱。
CONV 函数的参数顺序容易写反
CONV() 的签名是 CONV(str, from_base, to_base),第一个参数是字符串(不是数字),第二、三参数才是进制。常见错误是把十六进制数当数字传入,比如写成 CONV(FF, 16, 10) —— 这会报错 Unknown column 'FF' in 'field list',因为 MySQL 把 FF 当作列名而非字符串。
- 正确写法:用单引号包裹十六进制字面量,如
CONV('FF', 16, 10)→ 返回255 - 十六进制前缀
0x不能直接用:CONV('0xFF', 16, 10)会返回0(因含非有效数字字符) - 若字段值带
0x前缀(如表中存的是'0xA1B2'),需先用SUBSTR()截取:CONV(SUBSTR(hex_col, 3), 16, 10)
十六进制字符串大小写和空格敏感
CONV() 对字母大小写不敏感('a' 和 'A' 都认作 10),但严格拒绝空格、换行、制表符等空白字符。从外部导入或用户输入的 hex 值若含空格(如 'AB CD'),会静默转为 0,不报错也不提示。
- 安全做法:用
REPLACE()清理空白:CONV(REPLACE(TRIM(hex_str), ' ', ''), 16, 10) - 验证是否合法 hex:可用正则
hex_str REGEXP '^[0-9A-Fa-f]+$'做前置过滤 - 长度超长时(如 > 64 位),
CONV()会截断或返回NULL(取决于 SQL mode),建议限制输入长度
结果类型是字符串,不是整数
CONV() 总是返回字符串类型,即使结果是纯数字。这在 ORDER BY 或算术运算中可能引发隐式转换问题。例如 ORDER BY CONV(hex_col, 16, 10) 实际按字符串排序('100' '20'),而非数值大小。
- 需要数值比较时,显式加
+ 0或CAST(... AS UNSIGNED):CAST(CONV(hex_col, 16, 10) AS UNSIGNED) - 对大数(> 2^64),
UNSIGNED会溢出,此时改用DECIMAL:CAST(CONV(hex_col, 16, 10) AS DECIMAL(65,0)) - 若原 hex 值为空或非法,
CONV()返回'0',不是NULL,需用NULLIF()拦截:NULLIF(CONV(hex_col, 16, 10), '0')
真正麻烦的不是转换本身,而是 hex 数据来源不可控——用户粘贴、日志截取、二进制字段转义都可能混入前缀、空格、大小写甚至不可见控制符。别依赖 CONV() 的容错性,预处理比事后纠错更可靠。


















