Java PreparedStatement 保留表名大小写

Posted

技术标签:

【中文标题】Java PreparedStatement 保留表名大小写【英文标题】:Java PreparedStatement preserve table name casing 【发布时间】:2020-04-13 00:12:31 【问题描述】:

我有这个 Java sn-p,在 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]

因此,显然,它决定将表名大写,这是我不想要的。如何关闭它?

【问题讨论】:

您确定这不仅仅是将其记录为大写吗? 你试过把表名in quotes吗?所以,在 Java 中是"SELECT * FROM \"vehicles\";"。另外,您标记了 mariadb,但错误是 h2 - 这是否相关? SQL 不区分大小写。这里没有问题要解决。 @user207421 - 这不是特定于实现的吗?关键字,我同意 - 没关系。但是对于object names - 这不取决于 RDBMS,也许还取决于它的配置方式? @andrewjames 是的。我真正想知道的是,为什么 OP 反对只有开发人员才能看到的错误消息。 【参考方案1】:

这是不可能的,SQL 方言(通常)默认情况下不区分大小写,但以大写形式存储表名(某些方言将以小写形式存储)。这意味着如果您使用select * from vehicle,您实际上是从名为VEHICLE 的表中进行选择,并且错误消息将反映该名称,因为表vehicle 与表VEHICLE 是不同的实体。

如果您想在错误消息中反映原始大小写,您需要从一个真正名为vehicle 的表中进行选择。为此,您需要在所有 SQL 语句中引用对象名称,例如 select * from "vehicle",或者 - 在 MariaDB 和 mysql 中 - select * from `vehicle`。引用的对象名称保留其原始大小写。

【讨论】:

虽然这对于某些 DBMS(如 Oracle)可能是正确的,但我在 Linux 上运行 MariaDB 实例,其中关键字不区分大小写,但对象名称 - 表、数据库、视图等 - 不是。我将它们定义为小写,因此它们必须以小写形式访问。我会尝试引用。 ``` MariaDB [dbname]> 从车辆中选择 *;空集(0.00 秒)MariaDB [dbname]> select * from Vehicles;错误 1146 (42S02): 表 'dbname.Vehicles' 不存在``` @BenceCsókás 您问题中的错误来自 H2,而不是来自 MySQL 或 MariaDB。

以上是关于Java PreparedStatement 保留表名大小写的主要内容,如果未能解决你的问题,请参考以下文章

Java -- JDBC 学习--PreparedStatement

java中的PreparedStatement.addBatch有啥限制吗?

线程中的 PreparedStatement (java)

PreparedStatement 比使用 JDBC 的 Statement 慢

Java中PreparedStatement和Statement的用法区别

Java 的 PreparedStatement 是如何工作的?