[英]H2 user-defined-function org.h2.jdbc.JdbcSQLException non-hex character error
[英]H2 org.h2.jdbc.JdbcSQLException with correct DDL sql : error code = [42000-196]
在执行下面的ddl时,抛出org.h2.jdbc.JdbcSQLException
。 当然我在隔离环境中测试它,没有任何其他sql。 更令人尴尬的是,除了[42000-196]之外,错误消息没有提供任何提示。 我已经在官方网站上检查过这个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
我认为错误在这一行:
`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)
);
我从github问题得到了答案,如下所示。 我删除并重新生成了模式sql文件,现在它可以在没有任何sql更改的情况下工作。 sql是在云上的ERD工具上自动生成的,如SaaS,并通过Internet下载。 我猜文件有点受损了。
感谢github上的@katzyn ,以及来自 stackoverflow的akash verma这里的帮助:)
您的SQL语句错误地包含字节顺序标记(特殊Unicode字符U + FEFF)。 此字符仅可用作以某些Unicode编码编写的文本文件中的第一个字符,以区分它们。 但是,不应将此字符用于传递给JDBC方法的SQL语句的字符串中。
H2提供的脚本工具正确读取这些文件。
您正在使用Spring中的某个工具,因此,此工具不会正确跳过BOM标记,或者您的文本文件以某种方式损坏(例如,包含多个BOM)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.