Mysql中的delimiter详解
初学mysql时,可能不太明白delimiter的真正用途,delimiter在mysql很多地方出现,比如存储过程、触发器、函数等。
学过oracle的人,再来学mysql就会感到很奇怪,百思不得其解。
其实就是告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了。
默认情况下,delimiter是分号(;) 。
在命令行客户端中,如果有一行命令以分号结束,
那么回车后,mysql将会执行该命令。如输入下面的语句
mysql> select * from test_table;
然后回车,那么MySQL将立即执行该语句。
但有时候,不希望MySQL这么做。在为可能输入较多的语句,且语句中包含有分号。
如试图在命令行客户端中输入如下语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | mysql> CREATE FUNCTION `SHORTEN`(S VARCHAR( 255 ), N INT) mysql> RETURNS varchar( 255 ) mysql> BEGIN mysql> IF ISNULL(S) THEN mysql> <strong> RETURN '' ;</strong> mysql> ELSEIF N< 15 THEN mysql> RETURN LEFT(S, N); mysql> ELSE mysql> IF CHAR_LENGTH(S) <=N THEN mysql> <strong>RETURN S;</strong> mysql> ELSE mysql> RETURN CONCAT(LEFT(S, N- 10 ), '...' , RIGHT(S, 5 )); mysql> END IF; mysql> END IF; mysql> END; |
默认情况下,不可能等到用户把这些语句全部输入完之后,再执行整段语句。
因为mysql一遇到分号,它就要自动执行。
即,在语句RETURN '';时,mysql解释器就要执行了。
这种情况下,就需要事先把delimiter换成其它符号,如//或$$。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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的存储过程中,需要注意的一点是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | drop PROCEDURE if EXISTS proc_while_test; delimiter ;; CREATE DEFINER = root @localhost PROCEDURE proc_while_test(IN n int ) BEGIN DECLARE i int ; DECLARE s int ; SET i = 0 ; SET s = 0 ; WHILE i <= n DO SET s = s + i; set i++; set i = i + 1 ; end WHILE; select s; end ;; delimiter ; |
在上面的例子中,set i++;是会导致整个while循环报错。在mysql的存储过程中,i++是不允许这样写的。需要写成i=i+1这种形式才可以。
每天一小步,收获一大步
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Sdcb Chats 技术博客:数据库 ID 选型的曲折之路 - 从 Guid 到自增 ID,再到
· 语音处理 开源项目 EchoSharp
· 《HelloGitHub》第 106 期
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 使用 Dify + LLM 构建精确任务处理应用