具有正确 DDL sql 的 H2 org.h2.jdbc.JdbcSQLException:错误代码 = [42000-196]

Posted

技术标签:

【中文标题】具有正确 DDL sql 的 H2 org.h2.jdbc.JdbcSQLException:错误代码 = [42000-196]【英文标题】:H2 org.h2.jdbc.JdbcSQLException with correct DDL sql : error code = [42000-196] 【发布时间】:2018-04-08 05:28:39 【问题描述】:

在执行下面的 ddl 时,会抛出 org.h2.jdbc.JdbcSQLException。当然我是在隔离环境中测试的,没有其他任何sql。更尴尬的是,除了[42000-196],错误信息没有提供任何提示。我已经在official website 上检查了一些与此 sql 相关的特定于 h2 的语法,但是有没有我遗漏的特殊语法?

sql

CREATE TABLE Product
(
  `id`          BIGINT           NOT NULL    AUTO_INCREMENT COMMENT 'id',
  `title`       VARCHAR(1000)    NULL        COMMENT 'title',
  `price`       INT              NULL        COMMENT 'price',
  `simpledesc`  VARCHAR(1000)    NULL        COMMENT 'simpledesc',
  `content`     TEXT             NULL        COMMENT 'content',
  `stock`       INT              NULL        COMMENT 'stock',
  `seq`         INT              NULL        COMMENT 'product 끼리의 순서',
  `categoryid`  INT              NULL,
  `timelog`     DATETIME         NOT NULL    DEFAULT now() COMMENT 'timelog',
  PRIMARY KEY (id)
);

控制台上的错误消息

Caused by: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "[*] CREATE TABLE Product ( id BIGINT NOT NULL COMMENT 'id', title VARCHAR(1000) NULL COMMENT 'title', price INT NULL COMMENT 'price', simpledesc VARCHAR(1000) NULL COMMENT 'simpledesc', content TEXT NULL COMMENT 'content', stock INT NULL COMMENT 'stock', seq INT NULL COMMENT 'product 끼리의 순서', categoryid INT NULL, timelog DATETIME NOT NULL DEFAULT now() COMMENT 'timelog', PRIMARY KEY (id) )"; SQL statement:
 CREATE TABLE Product ( id BIGINT NOT NULL COMMENT 'id', title VARCHAR(1000) NULL COMMENT 'title', price INT NULL COMMENT 'price', simpledesc VARCHAR(1000) NULL COMMENT 'simpledesc', content TEXT NULL COMMENT 'content', stock INT NULL COMMENT 'stock', seq INT NULL COMMENT 'product 끼리의 순서', categoryid INT NULL, timelog DATETIME NOT NULL DEFAULT now() COMMENT 'timelog', PRIMARY KEY (id) ) [42000-196]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:345) ~[h2-1.4.196.jar:1.4.196]
    at org.h2.message.DbException.get(DbException.java:179) ~[h2-1.4.196.jar:1.4.196]
    at org.h2.message.DbException.get(DbException.java:155) ~[h2-1.4.196.jar:1.4.196]
    at org.h2.message.DbException.getSyntaxError(DbException.java:191) ~[h2-1.4.196.jar:1.4.196]
    at org.h2.command.Parser.getSyntaxError(Parser.java:534) ~[h2-1.4.196.jar:1.4.196]
    at org.h2.command.Parser.parsePrepared(Parser.java:492) ~[h2-1.4.196.jar:1.4.196]
    at org.h2.command.Parser.parse(Parser.java:321) ~[h2-1.4.196.jar:1.4.196]
    at org.h2.command.Parser.parse(Parser.java:297) ~[h2-1.4.196.jar:1.4.196]
    at org.h2.command.Parser.prepareCommand(Parser.java:258) ~[h2-1.4.196.jar:1.4.196]
    at org.h2.engine.Session.prepareLocal(Session.java:578) ~[h2-1.4.196.jar:1.4.196]
    at org.h2.engine.Session.prepareCommand(Session.java:519) ~[h2-1.4.196.jar:1.4.196]
    at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1204) ~[h2-1.4.196.jar:1.4.196]
    at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:176) ~[h2-1.4.196.jar:1.4.196]
    at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:164) ~[h2-1.4.196.jar:1.4.196]
    at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:95) ~[HikariCP-2.7.8.jar:na]
    at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement.java) ~[HikariCP-2.7.8.jar:na]
    at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:471) ~[spring-jdbc-5.0.4.RELEASE.jar:5.0.4.RELEASE]
    ... 121 common frames omitted

【问题讨论】:

【参考方案1】:

我认为错误在这一行:

`timelog`     DATETIME         NOT NULL    DEFAULT now() COMMENT 'timelog',

将此更新为然后检查是否出现任何错误:

 `timelog`     DATETIME         NOT NULL    COMMENT 'timelog',

--------已更新-------

在没有那个功能的情况下先试试这个(),我已经测试过这个

CREATE TABLE Product
(
  `id`          BIGINT           NOT NULL    AUTO_INCREMENT COMMENT 'id',
  `title`       VARCHAR(1000)    DEFAULT NULL        COMMENT 'title',
  `price`       INT              DEFAULT NULL COMMENT 'price',
  `simpledesc`  VARCHAR(1000)    DEFAULT NULL COMMENT 'simpledesc',
  `content`     TEXT             DEFAULT NULL COMMENT 'content',
  `stock`       INT              DEFAULT NULL COMMENT 'stock',
  `seq`         INT              DEFAULT NULL COMMENT 'product 끼리의 순서',
  `categoryid`  INT              DEFAULT NULL,
  `timelog`     DATETIME         NOT NULL     COMMENT 'timelog',
  PRIMARY KEY (id)
);

【讨论】:

我刚刚在没有DEFAULT now() 的情况下尝试过,但它失败并出现相同的错误代码 [42000-196]。不管怎样,谢谢你的建议:) 我已经更新了我的答案,检查一下,在那之前我会寻找那个 now() 函数 谢谢!但是我发现 [42000-196] 表示文件已损坏。现在它工作正常。我找到的解决方案在我的答案中进行了描述。感谢您快速而专注的帮助:)【参考方案2】:

我得到了github issue 的答复,如下所示。 我删除并重新生成了模式 sql 文件,现在它可以在没有任何 sql 更改的情况下工作。 sql 是在云上的 ERD 工具上自动生成的,作为 SaaS,并通过 Internet 下载。我猜这个文件有点损坏了。

感谢 github 上的 @katzyn 和 *** 上的 akash verma 的帮助 :)

您的 SQL 语句错误地包含字节顺序标记(特殊 Unicode 字符 U+FEFF)。此字符只能用作第一个 以某些 Unicode 编码编写的文本文件中的字符 区分它们。但是这个字符不应该用在 带有传递给 JDBC 方法的 SQL 语句的字符串。

H2 提供的脚本工具可以正确读取此类文件。

您正在使用 Spring 中的一些工具,所以这个工具可以 未正确跳过 BOM 标记或您的文本文件以某种方式损坏 (例如,包含多个 BOM)。

【讨论】:

以上是关于具有正确 DDL sql 的 H2 org.h2.jdbc.JdbcSQLException:错误代码 = [42000-196]的主要内容,如果未能解决你的问题,请参考以下文章

org.h2.jdbc.JdbcSQLException:对象已经关闭

org.h2.jdbc.JdbcSQLException:未知数据类型:“DATEADD”; SQL 语句

SQL 语句 org.h2.jdbc.JdbcSQLException 中的语法错误:

org.h2.jdbc.JdbcSQLException:找不到表“ALL_SEQUENCES”

org.h2.jdbc.JdbcSQLSyntaxErrorException:SQL 语句“CREATE[*] SCHEMA DATABASE”中的语法错误; SQL 语句:

获取“org.h2.jdbc.JdbcSQLException:找不到表“BOOK_PUBLISHERS”;SQL 语句:”