Mysql教程

13.8 其他函数

MySQL中除了上述函数以外,还包含了很多函数。例如FORMAT(x,n)函数用来格式化数字x,INET_ATION()函数可以将正转换为数字。本小节将详细讲解这些函数的作用和使用方法。

13.8.1 格式化函数FORMAT(x,n)

FORMAT(x,n)函数可以将数字\进行格式化,将X保留到小数点后N位。这个过程需要四舍五入。

例如FORMAT(2.356,2)返回的结果将会是2.36;FORMAT(2.353,2)返回的结果将会是2.35。

【示例13-63】下面使用FORMAT(x,n)函数来将235.3456和235.3454进行格式化,都保留到小数点后3位。


mysql> SELECT FORMAT(235.3456,3),FORMAT(235.3454,3);
+--------------------+--------------------+
| FORMAT(235.3456,3) | FORMAT(235.3454,3) |
+--------------------+--------------------+
| 235.346            | 235.345            |
+--------------------+--------------------+
1 row in set (0.04 sec)

结果显示,235.3456格式化后的结果是235.346; 235.3454格式化后的结果是235.345。这个数都保留到小数点后3位,而且都进行了四舍五入处理。

注意:FORMAT(x,n)函数可以将x保留到小数点后n位。在格式化过程中需要进行四舍五入的操作。FORMAT(x,n)函数与ROUND(x,y)函数相似,ROUND(x,y)函数返回x保留到小数点后y位的值,截断时需要进行四舍五入处理。

13.8.2不同进制的数字进行转换的函数

ASCII(S)返回字符串s的第一个字符的ASCII码;BIN(x)返回x的二进制编码;HEX(x) 返回x的十六进制编码;OCT(x)返回x的八进制编码;CONV(x,f1,f2)将x从f1进制数变成f2进制数。

【示例13-64】下面返回字符串‘ABC’的第一个字母的ASCII码;将十进制数28分别变成二进制数、十六进制数和八进制数;将28当作十六进制数,将其变成八进制数。

mysql> SELECT ASCII('ABC'),BIN(28),HEX(28),OCT(
+--------------+---------+---------+---------+
| ASCII('ABC') | BIN(28) | HEX(28) | OCT(28) |
+--------------+---------+---------+---------+
|           65 | 11100   | 1C      | 34      |
+--------------+---------+---------+---------+
1 row in set (0.02 sec)
mysql> SELECT CONV(28,10,2),CONV(28,16,2),CONV(28,16,8);
+---------------+---------------+---------------+
| CONV(28,10,2) | CONV(28,16,2) | CONV(28,16,8) |
+---------------+---------------+---------------+
| 11100         | 101000        | 50            |
+---------------+---------------+---------------+
1 row in set (0.00 sec)

结果显示,ASCII('ABC')的返回值是65,这正是字母A的ASCII码;十进制数28的二进制码是11100,十六进制码是10,八进制码是34。

CONV(28,10,2)^=,指定28为十进制数,然后将其变成二进制数,返回结果是11100; CONV(28,16,2),指定28为十六进制数,然后将其变成二进制数,返回结果是101000; CONV(28,16,8),指定28为十六进制数,然后将其变成八进制数,返回的结果是50。

13.8.3旧地址与数字相互转换的函数

INET_ZTON(ip)函数可以将IP地址转换为数字表示;INET_NTOA(n)函数可以将数字n转换成IP的形式。其中,INET_ZTON(ip)函数中IP值需要加上引号。这两个函数互为 反函数。

【示例13-65】下面演示INET_ZTON(ip),INET_NTOA(n)的函数的使用。

mysql> SELECT INET_ATON('59.65.226.15'),INET_NTOA(994173455);
+---------------------------+----------------------+
| INET_ATON('59.65.226.15') | INET_NTOA(994173455) |
+---------------------------+----------------------+
|                 994173455 | 59.65.226.15         |
+---------------------------+----------------------+
1 row in set (0.01 sec)

结果显示,两函数互为反函数。INET_ATON('59.65.226.15")IP值59.65.226.15变成 994173455;INET_NTOA(994173455)将数值 994173455 变成IP值 59.65.226.15。

13.8.4加锁函数和解锁函数

GET_LOCT(name,time)函数定义一个名称为name、持续时间长度为time的锁。如果锁定成功,返回1;如果尝试超时,返回0;如果遇到错误,返回NULL。RELEASE_LOCK(name)函数解除名称为name的锁。如果解锁成功,返回1;如果尝试超 时,返回0;如果解锁失败,返回NULL; IS_FREE_LOCK(name)函数判断是否使用名为 name的锁。如果使用,返回0;否则,返回1。

【示例13-66】下面增加一个名为MYSQL的锁,持续时间是10秒。然后判断这个锁是否加上,最后解除锁定。


mysql> SELECT GET_LOCK('MYSQL',10);
+----------------------+
| GET_LOCK('MYSQL',10) |
+----------------------+
|                    1 |
+----------------------+
1 row in set (0.00 sec)
mysql> SELECT IS_FREE_LOCK('MYSQL');
+-----------------------+
| IS_FREE_LOCK('MYSQL') |
+-----------------------+
|                     0 |
+-----------------------+
1 row in set (0.00 sec)
mysql> SELECT RELEASE_LOCK('MYSQL');
+-----------------------+
| RELEASE_LOCK('MYSQL') |
+-----------------------+
|                     1 |
+-----------------------+
1 row in set (0.00 sec)

结果显示,GET_LOCK('MYSQL',10)返回结果是1,说明成功的加上了一个名为 MYSQL且持续时间为10秒的锁;IS_FREE_LOCK('MYSQL')返回的结果是0,说明名为MYSQL的锁已经存在;RELEASE_LOCK(’MYSQL’)返回的结果是l,说明解锁成功。

注意:当执行=RELEASE_LOCK()、一个新的GET_LOCK()或者线程终止,那么之前加上的锁都自动解除。尤其值得注意的是在加上一个新锁后,原来的锁就会解除。 例如,GET_LOCK('a',20)加上一个名为a的锁,然后再通过GET_LOCK('b',20) 创建b锁。那么,a锁就自动解除了。

13.8.5重复执行指定操作的函数

BENCHMARK(ccmnt,expr)函数将表达式 expr重复执行count次,然后返回执行时间。 该函数可以用来判断MySQL处理表达式的速度。

【示例13-67】下面返回系统的时间是100000次,计算使用的时间。

mysql> SELECT BENCHMARK(100000,NOW());
+-------------------------+
| BENCHMARK(100000,NOW()) |
+-------------------------+
|                       0 |
+-------------------------+
1 row in set (0.00 sec)

结果显示,BENCHMARK(100000,NOW())返回的结果是0。这并不是说执行过程没有花费时间,而是时间很短,可以忽略不计。

13.8.6改变字符集的函数

CONVERT(s USING 08)函数将字符串s的字符集变成cs。

【示例13-68】下面将字符串‘ABC’的字符集变成gbk。

mysql> SELECT CHARSET('ABC'),CHARSET(CONVERT('ABC' USING gbk));
+----------------+-----------------------------------+
| CHARSET('ABC') | CHARSET(CONVERT('ABC' USING gbk)) |
+----------------+-----------------------------------+
| utf8           | gbk                               |
+----------------+-----------------------------------+
1 row in set (0.02 sec)

结果显示,ABC原来的字符集是utf8。使用CONVERT(’ABC’ USWG GBK)^, ABC 的字符集变成了gbk。

13.8.7 改变字段数据类型的函数

CAST(x AS type)和CONVERT(x,type)这两个函数将x变成type类型。这两个函数只对 BWARY、CHAR、DATE、DATETIME、TIME、SIGNED RsTTEGER、UNSIGNED ES[TEGER 这些类型起作用。但两种方法只是改变了输出值的数据类型,并没有改变表中字段的类型。

【示例13-69】下面t7表中的d字段为DATETIME类型,将其变为DATE类型,或者TIME类型。

mysql> SELECT d,CAST(d AS DATE),CONVERT(dJIME) FROM t7;
+-----------------------+-----------------+-------------------+
|             d         | CAST(d AS DATE) |   CONVERT(d,TIME) |
+-----------------------+-----------------+-------------------+
| 2009-10-28 19:47:59   |   2009-10-28    |      19:47:59     |
+-----------------------+-----------------+-------------------+
1 row in set (0.00 sec)

结果显示,d字段原来的取值是2009-10-28 19:47:59,这是DATETIME类型;CAST(d AS DATE)返回的结果是2009-10-28,这说明类型己经变成了DATE型;CONVERT(d,TIME) 返回的结果是19:47:59,这说明类型已经变成了TIME类型。


关注微信获取最新动态