Java PreparedStatement 保留 table 名称大小写
Java PreparedStatement preserve table name casing
我有这个 Java 片段,运行 在由 MariaDB 支持的 WildFly 服务器中:
var stmt = conn.prepareStatement("SELECT * FROM vehicles;");
ResultSet rs = stmt.executeQuery();
这给了我以下异常:
org.h2.jdbc.JdbcSQLException: Table "VEHICLES" not found; SQL statement:
SELECT * FROM vehicles; [42102-193]
所以,显然,它决定将 table 名称大写,我不希望这样。我怎样才能关闭它?
这是不可能的,SQL 方言默认情况下通常不区分大小写,但 table 名称以大写形式存储(某些方言将以小写形式存储)。这意味着如果您使用 select * from vehicle
,您实际上是 select 来自一个名为 VEHICLE
的 table,并且错误消息将反映该名称,因为 table vehicle
与 table VEHICLE
.
是不同的实体
如果要在错误消息中反映原始大小写,您需要从 table 中 select 真正调用 vehicle
。为此,您需要在所有 SQL 语句中引用对象名称,例如 select * from "vehicle"
,或者 - 在 MariaDB 和 MySQL - select * from `vehicle`
中。引用的对象名称保留其原始大小写。
我有这个 Java 片段,运行 在由 MariaDB 支持的 WildFly 服务器中:
var stmt = conn.prepareStatement("SELECT * FROM vehicles;");
ResultSet rs = stmt.executeQuery();
这给了我以下异常:
org.h2.jdbc.JdbcSQLException: Table "VEHICLES" not found; SQL statement:
SELECT * FROM vehicles; [42102-193]
所以,显然,它决定将 table 名称大写,我不希望这样。我怎样才能关闭它?
这是不可能的,SQL 方言默认情况下通常不区分大小写,但 table 名称以大写形式存储(某些方言将以小写形式存储)。这意味着如果您使用 select * from vehicle
,您实际上是 select 来自一个名为 VEHICLE
的 table,并且错误消息将反映该名称,因为 table vehicle
与 table VEHICLE
.
如果要在错误消息中反映原始大小写,您需要从 table 中 select 真正调用 vehicle
。为此,您需要在所有 SQL 语句中引用对象名称,例如 select * from "vehicle"
,或者 - 在 MariaDB 和 MySQL - select * from `vehicle`
中。引用的对象名称保留其原始大小写。