【Mysql】MySql中delimiter的作用

【Mysql】MySql中delimiter的作用阅读目录 MySql 中 delimiter 的作用例子先说结论 MySql 中 delimiter 的作用 Mysql 中默认命令的终止符是 但有时候 不希望 MySQL 这么做 因为你输入的 sql 语句可能要包含多句 句中也包含了 这时候就要使用 delimiter 换终止符啦 例子默认情况下 delimiter 是分号 在命令行客户端中 如果有一行命令以分号结束 那么回车后 mysql 将会执行该命令 如输入下面的语句 mysql gt select fromtest table 然后回车 那么

先说结论

MySql中delimiter的作用

Mysql 中默认命令的终止符是; , 但有时候,不希望MySQL这么做,因为你输入的sql 语句可能要包含多句,句中也包含了;, 这时候就要使用delimiter换终止符啦!

例子

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

mysql> select * from test_table; 

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

那么,执行多语句的sql 就要换终止符啦。例如要mysql 命令行客户端执行以下的sql 语句:

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> 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解释器才会执行这段语句
例子:

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) 

本文代码在 MySQL 5.0.41-community-nt 下运行通过。

编写了个统计网站访问情况(user agent)的 MySQL 存储过程。就是下面的这段 SQL 代码。

drop procedure if exists pr_stat_agent; -- call pr_stat_agent ('2008-07-17', '2008-07-18') create procedure pr_stat_agent ( pi_date_from date ,pi_date_to date ) begin -- check input if (pi_date_from is null) then set pi_date_from = current_date(); end if; if (pi_date_to is null) then set pi_date_to = pi_date_from; end if; set pi_date_to = date_add(pi_date_from, interval 1 day); -- stat select agent, count(*) as cnt from apache_log where request_time >= pi_date_from and request_time < pi_date_to group by agent order by cnt desc; end; 

我在 EMS SQL Manager 2005 for MySQL 这个 MySQL 图形客户端下可以顺利运行。但是在 SQLyog MySQL GUI v5.02 这个客户端就会出错。最后找到原因是没有设置好 delimiter 的问题。默认情况下,delimiter “;”用于向 MySQL 提交查询语句。在存储过程中每个 SQL 语句的结尾都有个 “;”,如果这时候,每逢“;”就向 MySQL 提交的话,当然会出问题了。于是更改 MySQL 的 delimiter,上面 MySQL 存储过程就编程这样子了:

delimiter //; -- 改变 MySQL delimiter 为:“//” drop procedure if exists pr_stat_agent // -- call pr_stat_agent ('2008-07-17', '2008-07-18') create procedure pr_stat_agent ( pi_date_from date ,pi_date_to date ) begin -- check input if (pi_date_from is null) then set pi_date_from = current_date(); end if; if (pi_date_to is null) then set pi_date_to = pi_date_from; end if; set pi_date_to = date_add(pi_date_from, interval 1 day); -- stat select agent, count(*) as cnt from apache_log where request_time >= pi_date_from and request_time < pi_date_to group by agent order by cnt desc; end; // delimiter ; // -- 改回默认的 MySQL delimiter:“;” 

当然,MySQL delimiter 符号是可以自由设定的,你可以用“/”或者“$$”等。但是 MySQL 存储过程中比较常见的用法是 “//”“$$”。上面的这段在 SQLyog 中的代码搬到 MySQL 命令客户端(MySQL Command Line Client)却不能执行。

mysql> delimiter //; -- 改变 MySQL delimiter 为:“//” mysql> mysql> drop procedure if exists pr_stat_agent // -> -> -- call pr_stat_agent ('2008-07-17', '2008-07-18') -> -> create procedure pr_stat_agent -> ( -> pi_date_from date -> ,pi_date_to date -> ) -> begin -> -- check input -> if (pi_date_from is null) then -> set pi_date_from = current_date(); -> end if; -> -> if (pi_date_to is null) then -> set pi_date_to = pi_date_from; -> end if; -> -> set pi_date_to = date_add(pi_date_from, interval 1 day); -> -> -- stat -> select agent, count(*) as cnt -> from apache_log -> where request_time >= pi_date_from -> and request_time < pi_date_to -> group by agent -> order by cnt desc; -> end; // -> -> delimiter ; // -- 改回默认的 MySQL delimiter:“;” -> // -> // -> // -> ; -> ; -> 

真是奇怪了!最后终于发现问题了,在 MySQL 命令行下运行“delimiter //; ”则 MySQL 的 delimiter 实际上是 “//;”,而不是我们所预想的“//”。其实只要运行指令“delimiter //” 就 OK 了。

mysql> delimiter // -- 末尾不要符号 “;” mysql> mysql> drop procedure if exists pr_stat_agent // Query OK, 0 rows affected (0.00 sec) mysql> mysql> -- call pr_stat_agent ('2008-07-17', '2008-07-18') mysql> mysql> create procedure pr_stat_agent -> ( -> pi_date_from date -> ,pi_date_to date -> ) -> begin -> -- check input -> if (pi_date_from is null) then -> set pi_date_from = current_date(); -> end if; -> -> if (pi_date_to is null) then -> set pi_date_to = pi_date_from; -> end if; -> -> set pi_date_to = date_add(pi_date_from, interval 1 day); -> -> -- stat -> select agent, count(*) as cnt -> from apache_log -> where request_time >= pi_date_from -> and request_time < pi_date_to -> group by agent -> order by cnt desc; -> end; // Query OK, 0 rows affected (0.00 sec) mysql> mysql> delimiter ; -- 末尾不要符号 “//” mysql> 

顺带一提的是,我们可以在 MySQL 数据库中执行在文件中的 SQL 代码。例如,我把上面存储过程的代码放在文件 d:\pr_stat_agent.sql 中。可以运行下面的代码建立存储过程。

mysql> source d:\pr_stat_agent.sql Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) 

source 指令的缩写形式是:“\.”

mysql> \. d:\pr_stat_agent.sql Query OK, 0 rows affected (0.00 sec) Query OK, 0 rows affected (0.00 sec) 

最后,可见 MySQL 的客户端工具在有些地方是各自为政,各有各的一套。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/219961.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午9:30
下一篇 2026年3月17日 下午9:30


相关推荐

  • MySQL数据库:索引的实现原理

    MySQL数据库:索引的实现原理

    2021年4月10日
    212
  • 计算机主机号是什么意思,在一台计算机的IP地址中,网络号和主机号指的是什么?…「建议收藏」

    计算机主机号是什么意思,在一台计算机的IP地址中,网络号和主机号指的是什么?…「建议收藏」匿名用户1级2014-09-29回答根据子网掩码,如255.255.255.0的子网掩码,三个255对应的就是网络号,0对应的就是主机号,202.119.32.8就是202.119.32是网络号,8是主机号子网掩码(1)子网TCP/IP网间网技术产生于大型主流机环境中,它能发展到今天的规模是当初的设计者们始料未及的。网间网规模的迅速扩展对IP地址模式的威胁并不是它不能保证主机地址的唯一性,而是会…

    2022年6月24日
    47
  • php判断正则_PHP正则验证大全

    php判断正则_PHP正则验证大全PHP 验证手机号 functionis mobile str returnpreg math 1 34578 1 d 9 str true false 验证邮箱号 functionisEm str returnfilter var str FILTER VALIDATE EMAIL 验证微信

    2026年3月17日
    2
  • 编码器计数原理与电机测速原理——多图解析[通俗易懂]

    编码器计数原理与电机测速原理——多图解析[通俗易懂]编码器,是一种用来测量机械旋转或位移的传感器。它能够测量机械部件在旋转或直线运动时的位移位置或速度等信息,并将其转换成一系列电信号。编码器分类按监测原理分类光电编码器光电编码器,是一种通过光电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。这是目前应用最多的传感器,光电编码器是由光源、光码盘和光敏元件组成。光栅盘是在一定直径的圆板上等分地开通若干个长方形孔。由于光电码盘与电动机同轴,电动机旋转时,光栅盘与电动机同速旋转,经发光二极管等电子元件组成的检测装置检测输出若干脉冲信号,通过计算每

    2022年10月1日
    4
  • 架构之美读书笔记之三

    架构之美读书笔记之三架构之美第三章问题 品质需求 1 系统的伸缩性需求 如大型在线游戏 需要满足大量用户 在线用户数量短时间内可能有很大的变化 这其中隐含的需求是 多用户并行分布式系统 系统运行在多台机器上高可扩展性 用于加入新的故事情节 意味着新的代码 高稳定性 可靠性 一个用户崩溃 不影响其他用户 数据一致性 多个用户看到同一个东西的状态应该是一样的 2

    2026年3月16日
    1
  • Centos7下安装与卸载Jdk1.8

    Centos7下安装与卸载Jdk1.8卸载查看已经安装的jdk[root@bogonjre]#rpm-qa|grepjdkjava-1.8.0-openjdk-headless-1.8.0.65-3.b17.el7.x86_64java-1.7.0-openjdk-1.7.0.91-2.6.2.3.el7.x86_64java-1.7.0-openjdk-headless-1.7.0.91-2.6.2.3.el7.x86_

    2022年6月25日
    33

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号