java - H2 数据库 - "Unknown data type",数据类型为空

标签 java sql h2

我从 H2 中收到一个非常奇怪的错误,它告诉我它不知道某种数据类型,但没有告诉我它是哪一种。

这是错误消息:

Unknown data type: ; SQL statement:
CREATE TABLE bans (id INT NOT NULL AUTO_INCREMENT, player_id INT NOT NULL, operator_id INT NOT NULL, end DATETIME NULL, reason VARCHAR(1024) NOT NULL, PRIMARY KEY (id), INDEX (player_id), INDEX (end), FOREIGN KEY (player_id) REFERENCES players(id), FOREIGN KEY (operator_id) REFERENCES players(id)) [50004-200]

这是简单的 SQL 查询:

CREATE TABLE bans (id INT NOT NULL AUTO_INCREMENT, player_id INT NOT NULL, operator_id INT NOT NULL, end DATETIME NULL, reason VARCHAR(1024) NOT NULL, PRIMARY KEY (id), INDEX (player_id), INDEX (end), FOREIGN KEY (player_id) REFERENCES players(id), FOREIGN KEY (operator_id) REFERENCES players(id))

我既不明白 H2 想要告诉我什么,也不明白该查询有什么问题。我尝试调整间距,但没有成功。

编辑1:

我正在使用此 JDBC 字符串打开数据库连接:

jdbc:h2:%s;AUTO_SERVER=%s;DATABASE_TO_UPPER=FALSE

(并使用String.format设置两个适当的值。第一个自然是基本文件名,第二个是TRUEFALSE(任一工作)。)

我不会更改任何其他设置或启用任何其他模式。我唯一做的就是之前创建 2 个表并向其中插入一些数据。

最佳答案

如果没有 MySQL 兼容模式,则无法在 H2 中使用非标准 INDEX(player_id)INDEX(end)。 (实际上,标准不涵盖数据库索引。)

使用 MySQL 兼容模式,或使用单独的 CREATE INDEX 命令,例如

CREATE INDEX ON bans(end);

不需要在player_id列上建立索引,因为H2将自动为约束FOREIGN KEY (player_id) REFERENCESplayer(id)创建非唯一索引。

另请注意,DATABASE_TO_UPPER=FALSE 的行为自 198 年 4 月 1 日起已发生更改。通过此设置,所有列名称都区分大小写。您可能需要改用DATABASE_TO_LOWER=TRUE

关于java - H2 数据库 - "Unknown data type",数据类型为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59186992/

相关文章:

java - 如何测试命令行界面 (CLI)?

h2 - H2数据库字符串要加时间戳

database - 如何在H2数据库中使用FULL-TEXT SEARCH?

sql - 需要大量时间的生产 Hadoop 查询

sql - 申报日期与选定日期不匹配

mysql - H2提示语法错误,MySQL接受它-但是,语法错误会给出正确的结果: Column … must be in the GROUP BY list;

java - 尝试将异常输出到文件 - 如何将对象传递到 catch block ?

java - 如何将此 spring-integration 配置从 XML 转换为 Java?

Java SSLServerSocket soTimeout 不起作用?

mysql - LEFT JOIN 2 Table 但只会返回 Table2 中的第一条记录