CONV:MySQL中十六进制转十进制的首选函数 在MySQL里,想把十六进制数转成十进制,CONV函数通常是那个最直接、最可靠的选择。它设计得相当纯粹,不认什么0x前缀,但只要你把字符串形式的十六进制值喂给它,它就能稳稳地给你算出来——对了,大小写它也不挑剔。 CONV 函数的基本用法和参数含义

在MySQL里,想把十六进制数转成十进制,CONV函数通常是那个最直接、最可靠的选择。它设计得相当纯粹,不认什么0x前缀,但只要你把字符串形式的十六进制值喂给它,它就能稳稳地给你算出来——对了,大小写它也不挑剔。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
先来拆解一下这个函数的签名:CONV(str, from_base, to_base)。这三个参数,每一个都挺关键:
str:必须是字符串类型,比如'A1'。直接写个整数或者带0x前缀的字面量进去,它可不认。from_base:源进制。这里要转十六进制,自然填16。to_base:目标进制。想得到十进制结果,那就填10。这里有个细节很容易被忽略:CONV返回的是字符串类型,不是整数。所以,如果你打算拿这个结果去做数值计算,最好用CAST(... AS UNSIGNED)给它显式地转一下,免得后续计算出岔子。
举个例子就清楚了:SELECT CONV('FF', 16, 10); 返回的会是字符串 '255'。
这个问题太典型了。很多朋友习惯性地把带0x前缀的字符串直接塞给CONV,结果却得到一个NULL,瞬间懵了。
原因很简单:CONV函数在设计上就不识别0x这个前缀。它把0和x都当成了非法字符,一旦遇到,就默默地返回一个NULL,连个错误都不报。这种静默失败,在排查问题时尤其让人头疼。
下面几种情况,可以帮你快速避坑:
CONV('0xFF', 16, 10) → 结果是 NULL(因为包含了非十六进制字符 0 和 x)。CONV(FF, 16, 10) → 这会直接报错(MySQL会把 FF 当成列名或者未定义的变量)。CONV('ff', 16, 10) → 这个没问题,小写字母它照样认识。CONV('', 16, 10) → 结果也是 NULL(空字符串它不接受)。实际场景中,数据库字段里存的十六进制数,常常是带着0x前缀的,比如'0xA1B2'。这时候,直接转换肯定不行,得先“清洗”一下数据。
怎么清洗呢?有几个常用方法:
SUBSTR(hex_code, 3),简单粗暴地去掉前两个字符。TRIM(LEADING '0x' FROM hex_code),它能确保只去掉开头的0x。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及以上版本,可以考虑新增一个生成列(Generated Column);或者,干脆维护一个冗余的十进制字段,用空间换时间。
再说边界。CONV函数内部是按照64位无符号整数来处理的。这意味着它有个上限:最大能处理CONV('FFFFFFFFFFFFFFFF', 16, 10),也就是十进制的18446744073709551615。如果输入的十六进制字符串超过了64位(也就是超过了16个字符),超出的部分会被静默丢弃。这个特性非常隐蔽,一旦数据超限,结果就会出错,而且很难立刻发现,务必警惕。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述