爱技术 & 爱分享
爱蛋蛋 & 爱生活

MySQL中的delimiter

这篇文章介绍一下 MySQL中delimiter的作用。

单词 delimiter 的中文释义是 分隔符

也就是说告诉 mysql 命令解释器,该条命令结束了。

默认情况下,delimiter是分号;。在命令行客户端中,如果有一行命令以分号结束,那么回车后,mysql将会执行该命令。如输入下面的语句:

mysql> select * from test_table;

然后回车,那么MySQL将立即执行该语句。

但是有时候我们并不想这样子做,比如说在建立存储过程、函数或者触发器的时候,那么我们可能无法避免的要输入;,所以这种时候我们可能希望 mysql 不要以 ;来作为命令结束的标志。

比如我们想在命令行输入如下语句:

mysql> CREATE FUNCTION `SHORTEN`(S VARCHAR(255), N INT)
mysql>     RETURNS varchar(255)
mysql> BEGIN
mysql> IF ISNULL(S) THEN
mysql>    RETURN '';
mysql> ELSEIF N<15 THEN
mysql>     RETURN LEFT(S, N);
mysql> ELSE
mysql>     IF CHAR_LENGTH(S) <=N THEN
mysql>    RETURN S;
mysql>     ELSE
mysql>    RETURN CONCAT(LEFT(S, N-10), '...', RIGHT(S, 5));
mysql>     END IF;
mysql> END IF;
mysql> END;

默认情况下,不可能等到用户把这些语句全部输入完之后,再执行整段语句。

因为mysql一遇到分号,它就要自动执行。

即,在语句RETURN '';时,mysql解释器就要执行了。

这种情况下,就需要事先把delimiter换成其它不会在语句中出现的符号,如//或$$。

那么需要怎么做呢? 这就要用到 delimiter 了

delimiter // 表示将分隔符换成 //

delimiter $$ 表示将分隔符换成 $$

可见 delimiter 的用法相当的清晰易懂

所以上面的代码可以修改为如下创建函数代码:

mysql> delimiter //
mysql> CREATE FUNCTION `SHORTEN`(S VARCHAR(255), N INT)
mysql>     RETURNS varchar(255)
mysql> BEGIN
mysql> IF ISNULL(S) THEN
mysql>    RETURN '';
mysql> ELSEIF N<15 THEN
mysql>     RETURN LEFT(S, N);
mysql> ELSE
mysql>     IF CHAR_LENGTH(S) <=N THEN
mysql>    RETURN S;
mysql>     ELSE
mysql>    RETURN CONCAT(LEFT(S, N-10), '...', RIGHT(S, 5));
mysql>     END IF;
mysql> END IF;
mysql> END;//
mysql> delimiter ;  //用完之后别忘记恢复默认的分隔符,以避免出现乌龙

这样只有当//出现之后,mysql解释器才会执行这段语句

创建存储过程例子:

mysql> delimiter //

mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)
-> BEGIN
-> SELECT COUNT(*) INTO param1 FROM t;
-> END;
-> //
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

mysql> CALL simpleproc(@a);
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @a;
+------+
| @a |
+------+
| 3 |
+------+
1 row in set (0.00 sec)

当然顺便提一下,也可以将sql语句放在文件中,然后以source命令来执行,比如将上面的代码放在 /Test/MysqlTest.sql中,然后在Mysql的命令行中执行 source /Test/MysqlTest.sql 来执行命令。

参考链接 : http://www.cnblogs.com/rootq/archive/2009/05/27/1490523.html

赞(0) 传送门
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。墨影 » MySQL中的delimiter