执行下面的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
答案 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)。