conv 是 mysql 中最直接可靠的十六进制转十进制函数,要求输入为无前缀字符串(如 'a1'),大小写不敏感,返回字符串类型,需用 cast 转为数值参与计算;不识别 '0x' 前缀,空字符串或非法字符导致 null;清洗可用 trim(leading '0x' from ...),性能上不宜在 where 中使用,且最大支持 64 位十六进制数。

CONV 是 MySQL 中最直接、最可靠的十六进制转十进制函数,无需额外处理前缀(如 0x),但必须传入字符串形式的十六进制值,且注意大小写不敏感。
CONV 函数的基本用法和参数含义
CONV 的签名是 CONV(str, from_base, to_base),其中:
• str 必须是字符串类型(如 'A1'),不能是整数或带 0x 前缀的字面量
• from_base 为 16 表示源为十六进制
• to_base 为 10 表示目标为十进制
• 返回值是字符串类型(不是整数),若需参与数值计算,建议显式转成 CAST(... AS UNSIGNED)
例如:SELECT CONV('FF', 16, 10); → 返回字符串 '255'
常见错误:为什么 CONV('0xFF', 16, 10) 返回 NULL?
因为 CONV 不识别 0x 前缀,遇到非法字符(如 0 后跟 x)会静默失败并返回 NULL。
以下情况都会导致意外结果:
-
CONV('0xFF', 16, 10)→NULL(含非十六进制字符0和x) -
CONV(FF, 16, 10)→ 报错(FF被当列名或未定义变量) -
CONV('ff', 16, 10)→ 正确(小写也支持) -
CONV('', 16, 10)→NULL(空字符串不被接受)
实际使用中如何安全提取和转换 HEX 字段
如果字段(如 hex_code)存储的是带 0x 前缀的十六进制字符串(如 '0xA1B2'),需先清洗再转换:
- 用
SUBSTR(hex_code, 3)去掉前两位(假设格式统一) - 用
TRIM(LEADING '0x' FROM hex_code)更健壮地移除前缀 - 加上
WHERE hex_code REGEXP '^0x[0-9A-Fa-f]+$'过滤无效值,避免CONV返回NULL - 最终组合:
CAST(CONV(TRIM(LEADING '0x' FROM hex_code), 16, 10) AS UNSIGNED)
性能与边界注意事项
CONV 在大表上做转换时不会走索引,应避免在 WHERE 子句中对字段调用它;如果频繁查询,建议新增一个生成列(MySQL 5.7+)或维护冗余十进制字段。
另外,十六进制字符串超过 64 位时,CONV 可能截断或溢出——它内部按 64 位无符号整数处理,最大支持 CONV('FFFFFFFFFFFFFFFF', 16, 10)(即 18446744073709551615)。超出部分会被静默丢弃,这点极易被忽略。











