下面要介绍的函数不能笼统地分为哪一类,但是这些函数也非常有用,例如重复指定操作 函数、改变字符集函数、IP 地址与数字转换函数等。下面将介绍这些函数的作用和使用方法
- 格式化函数 FORMAT(x,n) FORMAT(x,n)将数字 x 格式化,并以四舍五入的方式保留小数点后 n 位,结果以字符串的形 式返回。若 n 为 0,则返回结果函数不含小数部分。 使用 FORMAT 函数格式化数字,保留小数点位数为指定值,输入语句如下:
SELECT FORMAT(12332.123456, 4), FORMAT(12332.1,4), FORMAT(12332.2,0);
由结果可以看到,FORMAT(12332.123456, 4)保留 4 位小数点值,并进行四舍五入,结果为 12332.1235;FORMAT(12332.1,4)保留 4 位小数值,位数不够的用 0 补齐;FORMAT(12332.2,0)不 保留小数位值,返回结果为整数 12332。
- 不同进制的数字进行转换的函数
SELECT CONV('a',16,2), CONV(15,10,2),CONV(15,10,8), CONV(15,10,16);
CONV('a',16,2) 将十六进制的 a 转换为二进制表示的数值,十六进制的 a 表示十进制的数值 10,二进制的数值 1010 正好等于十进制的数值 10;CONV(15,10,2)将十进制的数值 15 转换为二进 制值,结果为 1111;CONV(15,10,8)将十进制的数值 15 转换为八进制值,结果为 17;CONV(15,10,16) 将十进制的数值 15 转换为十六进制值,结果为 F。 进制说明: 二进制,采用 0 和 1 两个数字来表示的数。它以 2 为基数,逢二进一。 八进制,采用 0、1、2、3、4、5、6、7 八个数字,逢八进一,以数字 0 开头。 十进制,采用 0~9,共 10 个数字表示,逢十进一。 十六进制,由 0~9、A~F 组成,以数字 0x 开头。与十进制的对应关系是:0~9 对应 0~9, A~F 对应 10~15。
- IP 地址与数字相互转换的函数
SELECT INET_ATON('209.207.224.40');
INET_NTOA(expr)给定一个数字网络地址(4 或 8bit),返回作为字符串的该地址的点地址表 示。 使用 INET_NTOA 函数将数值网络地址转换为字符串网络点地址,输入语句如下:
SELECT INET_NTOA(3520061480);
可以看到,INET_NTOA 和 INET_ATON 互为反函数。
- 加锁函数和解锁函数
SELECT GET_LOCK('lock1',10) AS GetLock,IS_USED_LOCK('lock1') AS ISUsedLock,IS_FREE_LOCK('lock1') AS ISFreeLock, RELEASE_LOCK('lock1') AS ReleaseLock;
GET_LOCK('lock1',10)返回结果为 1,说明成功得到了一个名称为‘lock1’的锁,持续时间为 10 秒。 IS_USED_LOCK('lock1')返回结果为当前连接 ID,表示名称为‘lock1’的锁正在被使用。 IS_FREE_LOCK('lock1')返回结果为 0,说明名称为‘lock1’的锁正在被使用。 RELEASE_LOCK('lock1')返回值为 1,说明解锁成功。
- 重复执行指定操作的函数
SELECT SHA('newpwd');
可以看到,PASSWORD 执行花费时间为 0.00sec。下面使用 BENCHMARK 函数重复执行 PASSWORD 操作 500000 次:
SELECT BENCHMARK(500000, SHA('newpwd'));
由此可以看出,使用 BENCHMARK 执行 500000 次的时间为 0.29 sec,明显比执行一次的时 间延长了。 提 示 :BENCHMARK 报告的时间是客户端经过的时间,而不是在服务器端的 CPU 时间,每次 执行后报告的时间并不一定是相同的。读者可以多次执行该语句,查看结果。
- 改变字符集的函数
SELECT CHARSET('string'),CHARSET(CONVERT('string' USING latin1));
默认为 gbk 字符集,通过 CONVERT 将字符串“string”的默认字符集改为 latin1。
- 改变数据类型的函数
SELECT CAST(100 AS CHAR(2)), CONVERT('2018-10-01 12:12:12',TIME);
可以看到,CAST(100 AS CHAR(2))将整数数据 100 转换为带有两个显示宽度的字符串类型, 结果为‘10’;CONVERT('2018-10-01 12:12:12',TIME)将 DATETIME 类型的值转换为 TIME 类型 值,结果为‘12:12:12’。