【问题标题】:The MySQL "DELIMITER" keyword isn't workingMySQL“DELIMITER”关键字不起作用
【发布时间】:2026-01-19 04:15:01
【问题描述】:

好吧,我一直在扯这个,为什么这不起作用?

DELIMITER |

CREATE PROCEDURE Decrypt_pw()
    READS SQL DATA
BEGIN
  SELECT 'Hey Select';
END|

它是如此基本,我很确定我使用了正确的语法,我错过了什么?

错误:

21:14:07  [DELIMITER - 0 row(s), 0.000 secs]  [Error Code: 1064, SQL State: 42000]  You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER |

CREATE PROCEDURE Decrypt_pw()
    READS SQL DATA
BEGIN
  SELECT 'He' at line 1
 21:14:07  [END| - 0 row(s), 0.000 secs]  [Error Code: 1064, SQL State: 42000]  You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'END|' at line 1

我正在使用最新版本的 DbVisualizer,这个问题可能出在软件本身吗?

也许我应该更好地解释一下自己,密码在我的数据库中加密(不用担心),这允许我解密它们,这是我正在处理的个人项目。

我正在尝试开发一个脚本,允许我运行它并设置必要的数据库、表等以使其工作,并且我需要一些也必须创建的 SP,我正在尝试创建一个SP 通过 mysqli_query,这可能吗?

基本上它是用于 php 应用程序的“设置脚本”。

更新:似乎this 应该可以工作,但是由于 HostGator 的人 -.- 不允许 PHP 中的对象,我不能使用对象。

我已经几乎放弃了 mysqli,因为它无法正常工作...

【问题讨论】:

  • DELIMITER 关键字是特定于客户端的,并且是 MySQL 命令行客户端的功能,而不是实际 MySQL 语言 API 的一部分。如果您需要更改 DbVizualizer 的分隔符,该应用程序中可能内置了另一种方法。
  • 你为什么要解密密码?这听起来很糟糕。
  • 查看我已经更好地解释了自己的帖子,如果您需要,我可以将完整的脚本发送给您,但这足以解决我的问题。
  • @Pedro'Xympa'Nascimento:我试过你的代码,它对我有用。
  • 我只是尝试 mysqli_query 并没有创建存储过程。

标签: mysql stored-procedures delimiter procedures dbvisualizer


【解决方案1】:

这可能是软件版本问题...我尝试了您的代码,它对我来说很好... 试试这个

DELIMITER //
    CREATE PROCEDURE Decrypt_pw()
            READS SQL DATA
      BEGIN
      SELECT 'Hey Select';
      END //
    DELIMITER ;

【讨论】:

  • 在 PHP 上也不起作用,一旦它遇到 delimiter 关键字,它就会抛出错误并停止脚本,这很有趣,因为如果我在 phpmyadmin 中更改 delimiter 选项,它就可以工作,但我我确定他们不使用 mysqli...
  • 我已经设法通过 shell_exec 让它工作,但它创建了一个空过程,好像它忽略了 BEGIN 和 END 之间的任何内容。
【解决方案2】:

至少从 9.1 开始,DBVisualizer 不支持 DELIMITER 关键字。这是他们的做法:link

【讨论】:

    【解决方案3】:

    绝对不是优雅的解决方法......但它有效。
    所有关于不炮轰的常见警告,yada yada yada。

    // here's the core stored procedure code
    $stored = <<<EOT
    CREATE PROCEDURE Decrypt_pw()
        READS SQL DATA
    BEGIN
      SELECT * FROM whatever;
    END #
    EOT;
    
    // first, shell out to change the delimiter using mysql command-line
    shell_exec('mysql -u user -ppassword -e "DELIMITER #");
    
    // assuming $pdo is a valid PDO connection 
    // send the command to create the stored procedure:
    $pdo->exec($stored);
    
    // now shell out again to change the delimiter back
    shell_exec('mysql -u user -ppassword -e "DELIMITER ;");
    

    【讨论】: