MySQL CONV()函数
SELECT CONV('5F',16,3);
这条SQL语句的作用是将十六进制数"5F"转换为三进制表示。
CONV()
是MySQL中的进制转换函数,语法为:CONV(number, from_base, to_base)
'5F'
是要转换的数字,使用十六进制表示16
表示输入数字的进制(这里是十六进制)3
表示要转换到的目标进制(这里是三进制)计算过程:
- 首先将十六进制"5F"转换为十进制:
- 5F₁₆ = 5×16¹ + 15×16⁰ = 80 + 15 = 95₁₀
- 然后将十进制95转换为三进制:
- 95 ÷ 3 = 31 余 2
- 31 ÷ 3 = 10 余 1
- 10 ÷ 3 = 3 余 1
- 3 ÷ 3 = 1 余 0
- 1 ÷ 3 = 0 余 1
- 从下往上读取余数:10112
所以
SELECT CONV('5F',16,3);
的结果应该是'10112'
。注意:在SQL中执行时,如果直接写
5F
而不加引号,可能会被解析为列名或引发语法错误,所以应该使用'5F'
作为字符串传入。
MySQL CONV()
函数详解
CONV()
是 MySQL 中的一个进制转换函数,用于将数字从一种进制表示转换为另一种进制表示。
语法
CONV(number, from_base, to_base)
参数说明
number:
- 要转换的数字,可以是字符串或数值
- 可以是正数或负数
- 对于大于10的进制,字母不区分大小写(A-F 和 a-f 等效)
from_base:
- 输入数字的原始进制
- 取值范围:2-36
to_base:
- 目标进制
- 取值范围:2-36
返回值
- 返回一个字符串,表示转换后的数字
- 如果任一参数为 NULL,则返回 NULL
- 如果 from_base 或 to_base 不在 2-36 范围内,返回 NULL
- 如果 number 包含非法字符(对于给定的 from_base),返回 0
使用示例
基本转换
-- 十六进制"5F"转十进制
SELECT CONV('5F', 16, 10); -- 结果: '95'-- 十进制95转二进制
SELECT CONV(95, 10, 2); -- 结果: '1011111'-- 二进制"1011111"转八进制
SELECT CONV('1011111', 2, 8); -- 结果: '137'
不同进制间的转换
-- 八进制转十六进制
SELECT CONV('77', 8, 16); -- 结果: '3F'-- 三十六进制转十进制
SELECT CONV('Z', 36, 10); -- 结果: '35' (Z在36进制中表示35)
边界情况
-- 非法进制
SELECT CONV('10', 1, 10); -- 结果: NULL (from_base < 2)
SELECT CONV('10', 37, 10); -- 结果: NULL (from_base > 36)-- 非法数字字符
SELECT CONV('2', 2, 10); -- 结果: '0' (数字2在二进制中非法)-- NULL处理
SELECT CONV(NULL, 10, 2); -- 结果: NULL
负数处理
-- 负数的转换
SELECT CONV('-10', 10, 2); -- 结果: '-1010'
注意事项
- 对于大于10的进制,字母A-Z(或a-z)表示10-35的值
- 转换结果总是以字符串形式返回,即使看起来像数字
- 如果 to_base 是负数,number 被视为有符号数,否则视为无符号数
- 在MySQL 8.0之前,CONV() 不支持BIGINT值,大数可能会被截断
实际应用场景
- 存储和显示不同进制的数据
- 处理硬件相关的数据(如寄存器值)
- 加密/解密算法实现
- 网络协议处理(如IP地址的不同表示形式)
性能考虑
CONV()
函数在MySQL中的实现效率较高,但对于大量数据的转换操作,建议在应用层处理,以减轻数据库负担。