MySQL中的分隔符

MySQL中的分隔符,mysql,delimiter,Mysql,Delimiter,我经常看到人们使用分隔符。我试图找出什么是分隔符,它们的用途是什么。在谷歌搜索了20分钟后,我没能找到一个让我满意的答案。所以,我现在的问题是:什么是分隔符,什么时候应该使用它们?除了默认的之外的分隔符通常用于定义函数、存储过程和触发器,其中必须定义多个语句。您定义了一个不同的分隔符,如$,用于定义整个过程的结束,但在它内部,每个语句都以结尾。这样,当代码在mysql客户机中运行时,客户机可以判断整个过程的结束位置,并将其作为一个单元执行,而不是执行其中的单个语句 请注意,DELIMITER关键

我经常看到人们使用分隔符。我试图找出什么是分隔符,它们的用途是什么。在谷歌搜索了20分钟后,我没能找到一个让我满意的答案。所以,我现在的问题是:什么是分隔符,什么时候应该使用它们?

除了默认的
之外的分隔符通常用于定义函数、存储过程和触发器,其中必须定义多个语句。您定义了一个不同的分隔符,如
$
,用于定义整个过程的结束,但在它内部,每个语句都以
结尾。这样,当代码在
mysql
客户机中运行时,客户机可以判断整个过程的结束位置,并将其作为一个单元执行,而不是执行其中的单个语句

请注意,
DELIMITER
关键字仅是命令行
mysql
client(和一些其他客户端)的函数,而不是常规的mysql语言功能。如果您试图通过编程语言API将其传递到MySQL,那么它将不起作用。其他一些客户端(如PHPMyAdmin)有其他方法来指定非默认分隔符

例子: 试图对不支持分隔符的客户端使用分隔符将导致将其发送到服务器,服务器将报告语法错误。例如,使用PHP和MySQLi:

$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
$result = $mysqli->query('DELIMITER $$');
echo $mysqli->error;
错误与:

您的SQL语法有错误;检查相应的手册 在第1行的“DELIMITER$$”附近使用正确的语法


DELIMITER语句将分号(;)的标准分隔符更改为另一个。分隔符从分号(;)更改为双斜杠//

为什么我们必须更改分隔符


因为我们希望将存储过程、自定义函数等作为一个整体传递给服务器,而不是让mysql工具一次解释每个语句。

当您创建一个具有
BEGIN…END
块的存储例程时,块内的语句以分号
(;)
终止。但是
CREATE过程
语句也需要一个终止符。因此,例程体中的分号是终止
CREATE过程
,还是终止过程体中的一条语句,就变得模棱两可了


解决歧义的方法是声明一个不同的字符串(不能出现在过程主体中),MySQL客户端将其识别为
CREATE procedure
语句的真正终止符。

您定义了一个分隔符,告诉MySQL客户端处理语句、函数、,存储过程或触发器作为整个语句。通常在.sql文件中设置不同的分隔符,如$$。DELIMITER命令用于更改MySQL命令的标准分隔符(即;)。由于例程(函数、存储过程或触发器)中的语句以分号(;)结尾,因此将它们视为复合语句 我们使用分隔符。如果在同一文件或命令行中使用不同例程时未定义,则会给出语法错误

请注意,您可以使用各种非保留字符来创建自己的自定义分隔符。您应该避免使用反斜杠(\)字符,因为这是MySQL的转义字符

DELIMITER实际上不是一个MySQL语言命令,而是一个客户端命令

例子
使用分隔符有什么意义?我没有真正理解它。@System.Data我回答的第一句话-定义存储过程、自定义函数和触发器时。任何时候在MySQL命令行上将多个语句作为一个单元执行。请注意,DELIMITER命令在PhpMyAdmin SQL(至少在某些版本)中不起作用。相反,您可以在单独的字段中将分隔符设置为SQL本身。这让我困惑了很长一段时间…:-)@高度不规则的是,我确实有一个关于PhpMyAdmin的注释——也许它需要被调用并进一步澄清?@MichaelBerkowski,你的意思是
delimiter
不是MySQL关键字吗?这是最好的答案,因为它以最简单的方式告诉我们使用delimiter的正确原因,并且不会引起任何混乱。谢谢
$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
$result = $mysqli->query('DELIMITER $$');
echo $mysqli->error;
DELIMITER $$

/*This is treated as a single statement as it ends with $$ */
DROP PROCEDURE IF EXISTS `get_count_for_department`$$

/*This routine is a compound statement. It ends with $$ to let the mysql client know to execute it as a single statement.*/ 
CREATE DEFINER=`student`@`localhost` PROCEDURE `get_count_for_department`(IN the_department VARCHAR(64), OUT the_count INT)
BEGIN
    
    SELECT COUNT(*) INTO the_count FROM employees where department=the_department;

END$$

/*DELIMITER is set to it's default*/
DELIMITER ;