Mysql 错误分隔符:行分隔符处错误

Posted

技术标签:

【中文标题】Mysql 错误分隔符:行分隔符处错误【英文标题】:Mysql Error Delimiter: Error at Line Delimiter 【发布时间】:2017-12-19 18:03:55 【问题描述】:

我正在尝试使用我发现的 mysql 函数,但我似乎遇到了一些错误。这是函数:

SET GLOBAL log_bin_trust_function_creators=1; 
DROP FUNCTION IF EXISTS digits; 
DELIMITER $$
CREATE FUNCTION digits( str CHAR(32) ) RETURNS CHAR(32) 
BEGIN 
  DECLARE i, len SMALLINT DEFAULT 1; 
  DECLARE ret CHAR(32) DEFAULT ''; 
  DECLARE c CHAR(1); 
  SET len = CHAR_LENGTH( str ); 
  REPEAT 
    BEGIN 
      SET c = MID( str, i, 1 ); 
      IF c BETWEEN '0' AND '9' THEN  
        SET ret=CONCAT(ret,c); 
      END IF; 
      SET i = i + 1; 
    END ; 
  UNTIL i > len END REPEAT; 
  RETURN ret; 
END 
$$
DELIMITER ; 

SELECT digits('123ab45cde6789fg');

我正在使用 Mariadb 5.5

Server version: 5.5.50-MariaDB MariaDB Server

这是我看到的错误:

[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '$$
DELIMITER ; 

我尝试了一些建议,例如更改最初是管道的分隔符。将分隔符从END 旁边移动到我已经完成的下面,但是,错误似乎发生在两者中。

我已经尝试了基本的修改来修复错误,但它仍然出现,虽然删除这部分时我不再收到任何错误,但结果不正确。

REPEAT 
  BEGIN 
    SET c = MID( str, i, 1 ); 
    IF c BETWEEN '0' AND '9' THEN  
      SET ret=CONCAT(ret,c); 
    END IF; 
    SET i = i + 1; 
  END ; 
UNTIL i > len END REPEAT; 

任何指针都会很棒。

更新

我测试了其他几个版本,也遇到了同样的问题。我目前正在使用 Navicat。

Server version: 5.5.50-MariaDB MariaDB Server
Server version: 5.5.31-0ubuntu0.12.10.1 (Ubuntu)
Server version: 5.1.73 Source distribution
Server version: 5.5.52-MariaDB MariaDB Server

【问题讨论】:

无法重现(MySQL 5.6)。 无法在Server version: 10.1.21-MariaDB MariaDB Server复制 MariaDB 5.x 真的很老了,不是吗? 你能把 Navicat 排除在外,直接在命令行界面中尝试吗? @UsagiMiyamoto - 5.0 大约在 8 年前开始,但他的版本只有 1 岁。尽管如此,还是建议升级到 10.1。 【参考方案1】:

我无法重现该问题:

MariaDB [_]> SELECT VERSION();
+----------------+
| VERSION()      |
+----------------+
| 5.5.56-MariaDB |
+----------------+
1 row in set (0.00 sec)

MariaDB [_]> SET GLOBAL log_bin_trust_function_creators=1;
Query OK, 0 rows affected (0.00 sec)

MariaDB [_]> DROP FUNCTION IF EXISTS digits;
Query OK, 0 rows affected (0.00 sec)

MariaDB [_]> DELIMITER $$

MariaDB [_]> CREATE FUNCTION digits( str CHAR(32) )
    -> RETURNS CHAR(32)
    -> BEGIN
    ->   DECLARE i, len SMALLINT DEFAULT 1;
    ->   DECLARE ret CHAR(32) DEFAULT '';
    ->   DECLARE c CHAR(1);
    ->   SET len = CHAR_LENGTH( str );
    ->   REPEAT
    ->     BEGIN
    ->       SET c = MID( str, i, 1 );
    ->       IF c BETWEEN '0' AND '9' THEN
    ->         SET ret=CONCAT(ret,c);
    ->       END IF;
    ->       SET i = i + 1;
    ->     END;
    ->   UNTIL i > len END REPEAT;
    ->   RETURN ret;
    -> END$$
Query OK, 0 rows affected (0.00 sec)

MariaDB [_]> DELIMITER ; 

MariaDB [_]> SELECT digits('123ab45cde6789fg');
+----------------------------+
| digits('123ab45cde6789fg') |
+----------------------------+
| 123456789                  |
+----------------------------+
1 row in set (0.00 sec)

【讨论】:

以上是关于Mysql 错误分隔符:行分隔符处错误的主要内容,如果未能解决你的问题,请参考以下文章

在mysql中给出错误的过程

UITableView 分隔符在错误的位置

Convert.ToDouble 使用错误的小数分隔符

如何在 MySQL 中存储欧洲货币?

pandas.read_csv 不在分号分隔符处对数据进行分区

MySQL 组连接行分隔符