Java 使用JDBC创建表查询不适用于不同的数据库引擎

Java 使用JDBC创建表查询不适用于不同的数据库引擎,java,sql,scala,jdbc,Java,Sql,Scala,Jdbc,我编写了一个scala程序,可以与一些数据库引擎进行互操作,例如MySQL、PostgreSQL 我使用JDBCAPI来处理SQL查询。我使用查询来创建表,我想用用户给定的字段创建一个表,然后这些字段是可以包含空格或带重音的单词的名称 例如,创建一个表虚拟,其中有两个字段“column 1”和“column 2”作为varchar字段 为MySQL数据库编写此查询时,在保留字段中包含的空格的同时,我们需要在查询中使用反勾号,如: CREATE TABLE dummy (`column 1` va

我编写了一个scala程序,可以与一些数据库引擎进行互操作,例如MySQL、PostgreSQL

我使用JDBCAPI来处理SQL查询。我使用查询来创建表,我想用用户给定的字段创建一个表,然后这些字段是可以包含空格或带重音的单词的名称

例如,创建一个表虚拟,其中有两个字段“column 1”和“column 2”作为varchar字段

为MySQL数据库编写此查询时,在保留字段中包含的空格的同时,我们需要在查询中使用反勾号,如:

CREATE TABLE dummy (`column 1` varchar(20), `column 2` varchar(20));
同样,在保留空格的同时为PostgreSQL编写此查询的正确方法是:

CREATE TABLE dummy ("column 1" varchar(20), "column 2" varchar(20));
也许对于另一个数据库引擎,有一种不同的方式来编写这个查询

是否有任何标准方法可以使用上面的constraints编写此查询,并使用JDBC使其与任何数据库引擎一起工作


提前感谢您的回答。

这并不能直接回答您的问题,但我认为您最好不要这样命名您的专栏。我会“规范化”列名,例如用下划线替换空格

无论如何,列名都不应该直接向用户公开。
如果您需要列的“人类可读”名称,我会将它们存储在另一个表中。或者,如果它像保留空格一样简单,只需颠倒过程,用空格替换下划线。

如前所述,您不应使用空格、特殊字符或保留字作为列或表名。为了安全起见,通常可以在表名和列名周围加引号,以避免数据库中出现区分大小写的问题

CREATE TABLE "foo" ("id" VARCHAR(32), "bar" VARCHAR(64))
根据SQL-99标准,双引号用于分隔标识符。区分大小写实际上与所使用的数据库类型及其设置有关。如果表和列名没有被引用,有些dbs会将它们大写或小写,但有时仅在CREATETABLE或ALTERTABLE命令中使用。这可能会导致运行时错误

例如,createtablefoo实际上可能创建一个名为foo的表。执行SELECT*FROM foo时,可能会出现错误,因为表foo不存在,但表foo确实存在。在使用了大量DBMS之后,我倾向于使用引号作为表名和列名

重要的一点是,在使用引号时必须坚持使用小写或大写,因为foo不等于foo,但foo可能等于foo,这取决于所使用的DBMS。可以使用小写或大写,但如果使用引号,请坚持使用小写或大写

您还应该尽可能避免特定于数据库的列类型坚持使用ANSI SQL

但是手工进行数据库迁移非常繁琐而且容易出错。我建议使用迁移工具flyway db,或者让像slick这样的库来创建迁移


正如您提到的scala,请看一下Slick,它是scala的一个功能强大的数据库层。还有一些其他的,但是我用得很重,可以推荐它。

你可以考虑使用一个像Hibernate这样的ORM工具,它将处理一些在SyTrask中特定于数据库的细微差别。但处理空格i、列名和区分大小写的名称是一场噩梦。我会禁止这样做。或者用下划线替换空格。不,引用表、列和其他标识符的名称会产生区分大小写的问题,而不是避免这些问题。