【问题标题】:How to interpret a synax error 1064 in mariadb/mysql如何解释 mariadb/mysql 中的语法错误 1064
【发布时间】:2020-02-28 06:18:45
【问题描述】:

考虑以下 sql 查询:

CREATE FUNCTION spell_number (integer a) RETURNS string
BEGIN
  ...
END;

这将返回通用语法“您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册以获取正确的语法以使用近字符串”

是否有可能收到如下错误? :

应为有效类型,但遇到“字符串”

【问题讨论】:

  • 这是可能的,如果有人在 mysql 中开发了这个功能。在那之前,我们一直被这些非常无用的错误消息所困扰。

标签: mysql compiler-errors mariadb syntax-error


【解决方案1】:

通常解析错误 1064 是描述性的:它告诉您解析器在哪里发现错误以及在哪一行:

$ perror 1064
MySQL error code 1064 (ER_PARSE_ERROR): %s near '%-.80s' at line %d

在您的示例中,near 后面的字符串似乎为空(= '')。如果解析器到达 SQL 语句的末尾但需要更多数据,则会发生这种情况。如果您尝试在命令行客户端中创建过程或函数而不使用分隔符,通常会发生这种情况:

命令行客户端的默认分隔符是分号(;)。命令行客户端解析 CREATE 函数并将第一部分直到分隔符发送到服务器。由于现在 CREATE 语句不完整,解析器到达语句的结尾,但需要更多数据。

例子:

MariaDB [test]> CREATE FUNCTION test (a integer) RETURNS integer
    -> BEGIN
    ->    SET a=a*2;
ERROR 1064 (42000): 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 '' at line 3
MariaDB [test]> delimiter //
MariaDB [test]> CREATE FUNCTION test (a integer) RETURNS integer
    -> BEGIN
    ->    SET a=a*2;
    ->    RETURN a;
    -> END//
Query OK, 0 rows affected (0.01 sec)

现在是描述性错误消息:

CREATE FUNCTION test1 (a integer) RETURNS integer
    -> BEGIN
    ->    "This should return a descriptive error message";
    ->    RETURN a;
    -> END//
ERROR 1064 (42000): 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 '"This should return a descriptive error message";

【讨论】:

  • ... near '' at line ... 的另一种情况是不平衡括号。
  • Rick:所有陈述不完整的案例 未关闭的评论.... 仍然很好奇为什么我的回答会被否决 - 它有什么错误吗?!
  • 打败我。 (我用赞成票取消了它。)我希望人们能阅读 1064 消息——它非常在有问题的令牌之前或之后都很好。
  • 例如 gcc 之类的 C 编译器会返回一个非常相似的错误:“Unexpected end of file”,这更具描述性。
猜你喜欢
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
  • 2016-09-29
  • 2022-01-15
  • 2015-04-25
  • 1970-01-01
  • 2017-05-06
  • 2018-03-05
相关资源
最近更新 更多