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

时间:2018-04-08 05:28:40

标签: java spring spring-boot h2

执行下面的ddl时,会抛出org.h2.jdbc.JdbcSQLException。当然我在隔离环境中测试它,没有任何其他sql。更令人尴尬的是,除了 [42000-196] 之外,错误消息不提供任何提示。我已经检查了这个sql与official website相关的一些特定于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

2 个答案:

答案 0 :(得分: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)
);

答案 1 :(得分:0)

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

感谢github上的@katzyn和stackoverflow上的akash verma以获得他们的帮助:)

  

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

     

H2提供的脚本工具正确读取这些文件。

     

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