MySQL提供的系统函数及运算子的清单如下列连结网页:
http://dev.mysql.com/doc/refman/5.1/en/func-op-summary-ref.html
前两天已讨论过部分的系统函数, 今天继续讨论...
MySQL的函数大列9大类:
今天介绍6. 型别转换函数, 7. XML函数, 8. 其他函数, 9. 用在Group By场合下的函数型别转换函数
BINARY: 将字串参数转换为二进位制的字串
这不是说会回传二进位制字串, 因为BINARY不是函数运作方式, 而是"修饰词"...我们用例子来讨论
mysql> SELECT 'a' = 'A';
-> 1 <-- 在MySQL大小写不分, 所以"'a' = 'A'"条件句的结果是真(True, 也可以1表示)
mysql> SELECT BINARY 'a' = 'A';
-> 0 <-- 用了Binary来"修饰", 'a'的二进位值和'A'的二进位值不同, 所以得到0(False)
mysql> SELECT 'a' = 'a ';
-> 1
mysql> SELECT BINARY 'a' = 'a ';
-> 0
CAST(), Convert(): 将第一个参数的值, 以第二个参数指定的资料型态来表示
可用于指定转换的资料型态有: BINARY[(N)], CHAR[(N)], DATE, DATETIME, DECIMAL[(M[,D])], SIGNED [INTEGER], TIME, UNSIGNED [INTEGER]
CAST('2009-11-13' AS DATE)和CONVERT('2009-11-13', DATE)都是一样的用法, CONVERT还有另外一种用法是搭配USING做字元集转换, 例如CONVERT('XYZ' USING utf8);将字串'XYZ'转换为utf8字元集
现在的资料库多半支援XML的应用, MySQL也不例外, 在MySQL中与XMP有关的只有两个
ExtractValue()(v5.1.5):以XPath标记找到XML字串中的某一栏值, 我们来看看例子
mysql> SET @xml = 'XY';
Query OK, 0 rows affected (0.00 sec)
mysql> SET @i =1, @j = 2;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @i, ExtractValue(@xml, '//b[$@i]'); <-- '//b[$@i]'相当于'//b[1]', 这就是XPath标记, 找出第一个..的值
+------+--------------------------------+
| @i | ExtractValue(@xml, '//b[$@i]') |
+------+--------------------------------+
| 1 | X |
+------+--------------------------------+
1 row in set (0.00 sec)
mysql> SELECT @j, ExtractValue(@xml, '//b[$@j]');
+------+--------------------------------+
| @j | ExtractValue(@xml, '//b[$@j]') |
+------+--------------------------------+
| 2 | Y |
+------+--------------------------------+
1 row in set (0.00 sec)
mysql> SELECT @k, ExtractValue(@xml, '//b[$@k]');
+------+--------------------------------+
| @k | ExtractValue(@xml, '//b[$@k]') |
+------+--------------------------------+
| NULL | |
+------+--------------------------------+
1 row in set (0.00 sec)
UpdateXML()(v5.1.5): 传回被更新的XML片断
mysql> SELECT
-> UpdateXML('ccc', '/a', 'fff') AS val1,
-> UpdateXML('ccc', '/b', 'fff') AS val2,
-> UpdateXML('ccc', '//b', 'fff') AS val3,
-> UpdateXML('ccc', '/a/d', 'fff') AS val4,
-> UpdateXML('ccc', '/a/d', 'fff') AS val5
-> \G
val1: fff
val2: ccc
val3: fff
val4: cccfff
val5: ccc
MySQL还提供一些其他系统不常见的函数, 诸如
位元运算函数: 例如BIT_COUNT
压密和压缩函数: 例如PASSWORD()、ENCODE()、DECODE()等等, PASSWORD()是用来产生加密密码的函数
MySQL资料库系统讯息函数: 像是SCHEMA()、ROW_COUNT()、VERSION()、USER()等等函数
其他杂项函数: 如SLEEP()函数
由于这些函数的用途相当广泛, 我只说明部份与MySQL资料库系讯息有关的函数, 其他的部份就留待有兴趣的网友自行研究MySQL文件了. 几个与资料库系统讯息相关的函数如下列:
BENCHMARK(): 重覆执行第二个参数的SQL指令, 共执行第一个参数指定的次数, 例如
mysql> SELECT BENCHMARK(1000000, (SELECT user FROM USER));
+---------------------------------------------+
| BENCHMARK(1000000, (SELECT user FROM USER)) | <-- 要注意的是, SELECT必须只有一个栏位, 多了就不能执行
+---------------------------------------------+
| 0 |
+---------------------------------------------+
1 row in set (0.06 sec)
mysql> SELECT BENCHMARK(100000000, (SELECT user FROM USER));
+-----------------------------------------------+
| BENCHMARK(100000000, (SELECT user FROM USER)) | <-- 增加执行次数, 看看会花多久时间
+-----------------------------------------------+
| 0 |
+-----------------------------------------------+
1 row in set (2.91 sec)
CHARSET()(v4.1.0): 传回参数的所属字元集, 例如CHARSET(CONVERT('XYZ' USING utf8))传回'utf8'
CONNECTION_ID(): 回传SESSION的资料库连线ID
CURRENT_USER(), CURRENT_USER: 回传SESSION的资料库连线帐号名称和主机名称, 例如'root@localhost'
DATABASE(), SCHEMA()(v5.0.2): 传回SESSION正在使用的资料库名称
FOUND_ROWS(): 回传SELECT指令找到的资料录数目, 使用上有些限制, 必需要在需要提供资料录数的SELECT指令中加入SQL_CALC_FOUND_ROWS修饰词, 例如
mysql> SELECT SQL_CALC_FOUND_ROWS user FROM USER;
+-------+
| user |
+-------+
| simon |
| root |
+-------+
2 rows in set (0.00 sec)
mysql> SELECT FOUND_ROWS();
+--------------+
| FOUND_ROWS() |
+--------------+
| 2 |
+--------------+
1 row in set (0.00 sec)
LAST_INSERT_ID(): 有时候, 我们会在资料表中用一些自动增加序号的栏位, 这个函数就是用来查询最近使用的最大序号为何的函数.
ROW_COUNT()(v5.0.1): 回传最近一次INSERT、UPDATE、DELETE指令所处理的资料录的数目
USER(), SESSION_USER(), SYSTEM_USER(): 由Client端连线到资料库的Session使用的帐号与主机名称
VERSION(): 回传正在使用的MySQL资料库的版本编号
<<还有最后一个与GROUP BY有关的函数, 放在另一篇了...续>>