H2 org.h2.jdbc.JdbcSQLException с правильным DDL sql: код ошибки = [42000-196]

При выполнении ddl ниже выдается org.h2.jdbc.JdbcSQLException. Конечно, я тестировал его в изолированной среде, без каких-либо других sql. Еще больше смущает то, что сообщение об ошибке не содержит никаких подсказок, кроме [42000-196]. Я уже проверил некоторую грамматику, специфичную для h2, к которой относится этот sql на Официальный веб-сайт, но есть ли особая грамматика, которую я пропустил?

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
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
0
3 482
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Думаю, ошибка в этой строчке:

`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]. В любом случае спасибо за совет :)

jjangga 08.04.2018 07:43

Я обновил свой ответ, проверьте это, а пока я буду искать эту функцию now ()

akash verma 08.04.2018 08:12

Спасибо! Однако я обнаружил, что [42000-196] означает, что файл поврежден. И теперь он отлично работает. Решение, которое я нашел, описано в моем ответе. Благодарю за вашу быструю и преданную помощь :)

jjangga 08.04.2018 08:39
Ответ принят как подходящий

Я получил ответ от проблема с github, как показано ниже. Я удалил и регенерировал файл схемы sql, и теперь он работает без каких-либо изменений sql. Sql был автоматически сгенерирован в инструменте ERD в облаке, как SaaS, и загружен через Интернет. Думаю, файл был каким-то образом поврежден.

Спасибо @katzyn на github и Акаш Верма на stackoverflow здесь за их помощь :)

Your SQL statement incorrectly contains byte order mark (special Unicode character U+FEFF). This character may be used only as a first character in a text file written in some of Unicode encodings to distinguish between them. But this character should not be used in strings with SQL statements passed to JDBC methods.

Script tool provided with H2 reads such files correctly.

You are using some tool from Spring instead, so either this tool does not skip BOM mark correctly or your text file is damaged somehow (contains more than one BOM, for example).

Другие вопросы по теме