MySQL数据库中delimiter的作用概述
以下的文章主要是向大家描述的是MySQL数据库中delimiter的作用是什么?我们一般都认为这个命令和存储过程关系不大,到底是不是这样的呢?以下的文章将会给你相关的知识,望你会有所收获。
其实就是告诉MySQL解释器,该段命令是否已经结束了,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换成其它符号,如//或$$。
- 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数据库的客户端工具在有些地方是各自为政,各有各的一套。
MySQL数据库中delimiter的作用概述的更多相关文章
- MySql中delimiter的作用是什么?
这个命令与存储过程没什么关系吧.其实就是告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了.默认情况下,delimiter是分号;.在命令行客户端中,如果有一行命令以分号结束,那么 ...
- mysql数据库中,flush logs语句的作用是什么呢?
需求描述: 今天在研究mysql数据库的备份和恢复,用到了flush logs这个SQL语句. 所以,在此进行测试,并且记录该SQL语句的作用. 概念描述: 在mysql数据库,如果数据库启动的时候, ...
- 在mysql数据库中制作千万级测试表
在mysql数据库中制作千万级测试表 前言: 最近准备深入的学一下mysql,包括各种引擎的特性.性能优化.分表分库等.为了方便测试性能.分表等工作,就需要先建立一张比较大的数据表.我这里准备先建一张 ...
- Mysql数据库中InnoDB和MyISAM的差别
Mysql数据库中InnoDB和MyISAM的差别 InnoDB和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处理, ...
- 如何从mysql数据库中取到随机的记录
如何从mysql数据库中取到随机的记录 一.总结 一句话总结:用随机函数newID(),select top N * from table_name order by newid() ----N是一个 ...
- JMS服务器ActiveMQ的初体验并持久化消息到MySQL数据库中
JMS服务器ActiveMQ的初体验并持久化消息到MySQL数据库中 一.JMS的理解JMS(Java Message Service)是jcp组织02-03年定义了jsr914规范(http://j ...
- 为什么在MySQL数据库中无法创建外键?(MyISAM和InnoDB详解)
问题描述:为什么在MySQL数据库中不能创建外键,尝试了很多次,既没有报错,也没有显示创建成功,真实奇了怪,这是为什么呢? 问题解决:通过查找资料,每次在MySQL数据库中创建表时默认的情况是这样的: ...
- PHP往mysql数据库中写入中文失败
该类问题解决办法就是 在建立数据库连接之后,将该连接的编码方式改为中文. 代码如下: $linkID=@mysql_connect("localhost","root&q ...
- MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述
MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述: 1.MySQL有多种存储引擎: MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB(Berk ...
随机推荐
- 大话JS面向对象之开篇万物皆对象------(ATM取款机引发的深思)
一,总体概要 OO(面向对象)概念的提出是软件开发工程发展的一次革命,多年来我们借助它使得很多大型应用程序得以顺利实现.如果您还没有掌握并使用OO进行程序设计和开发,那么您无疑还停留在软件开发的石器时 ...
- [ZigBee] 16、Zigbee协议栈应用(二)——基于OSAL的无线控制LED闪烁分析(下)
说在前面:上一篇介绍了无线LED闪烁实现的OSAL部分,本篇介绍如何实现无线数据收发及数据处理: 上一篇是用SI跟着流程查看源码,我个人认为以架构的思维去了解代码能让人更清晰 ::ZMain.c程序入 ...
- Aspose.Words 16.8 破解版、添加自定义HTML导出Jpeg压缩质量配置
0x01 Aspose.Words 介绍Aspose.Words是一个商业.NET类库,可以使得应用程序处理大量的文件任务.Aspose.Words支持Doc,Docx,RTF,HTML,OpenDo ...
- EF:Oracle.DataAccess.Client.OracleException: ORA-12154: TNS:could not resolve the connect identifier specified
报告错误:Oracle.DataAccess.Client.OracleException: ORA-12154: TNS:could not resolve the connect identifi ...
- Thread.Sleep引发ThreadAbortException异常
短信平台记录日志模块,是通过异步方式来记录的,即日志工具类里初始化一个Queue对象,公共的写日志方法的处理逻辑是把日志消息放到Queue里.构造器里设定一个死循环,不停的读队,然后把日志消息持久化到 ...
- 【深入浅出Linux网络编程】 “基础 -- 事件触发机制”
回顾一下“"开篇 -- 知其然,知其所以然"”中的两段代码,第一段虽然只使用1个线程但却也只能处理一个socket,第二段虽然能处理成百上千个socket但却需要创建同等数量的线程 ...
- Lightmaping
一.基本知识点 1.Baked Only:不会传入shader,只有烘焙时才有用,也就是_LightColor0等这种变量不会表示一个Baked Only Light(前提是场景有lightmap,如 ...
- Android 开源框架Universal-Image-Loader完全解析(一)--- 基本介绍及使用
转载博客:http://blog.csdn.net/xiaanming/article/details/26810303 大家好!差不多两个来月没有写文章了,前段时间也是在忙换工作的事,准备笔试面试什 ...
- EntityFramework之你不知道的那些事(七)
前言 前面一系列几乎都是循序渐进式的进行叙述,似乎脚步走得太快了,于是我开始歇一歇去追寻一些我所不太了解的细枝末节,在此过程中也屡次碰壁,但是唯有如此才能更好的成长,不是吗!希望此文对你亦有帮助. 属 ...
- 【记录】AutoMapper Project To not support ResolveUsing
示例代码: public List<OrderLineDTO> GetLinesForOrder(int orderId) { Mapper.CreateMap<OrderLine, ...