【问题标题】:Java PreparedStatement is Undesirably Passing Lower-Case String Names to Case-sensitive PostgreSQL Database in SQL Query [duplicate]Java PreparedStatement 在 SQL 查询中不希望地将小写字符串名称传递给区分大小写的 PostgreSQL 数据库 [重复]
【发布时间】:2020-02-10 23:24:06
【问题描述】:

我正在使用 Java PreparedStatement 对象将行插入到 Postgres 数据库表中。 (我的代码如下:)

...
// define values to insert
LocalDateTime localDateTime = LocalDateTime.now();
int num = 3;            
double frac = 0.8;

//create PreparedStatement
PreparedStatement st = conn.prepareStatement("INSERT INTO TABLE_Final_Records(Datetime, Number_n, Fraction_f)" 
+ "VALUES (?,?,?)" );

// set placeholder ("?") values as Postgres types
st.setObject(1, localDateTime);
st.setInt(2, num);
st.setDouble(3, frac);

// execute statement
st.executeUpdate();
st.close(); 
...

但是,当我执行上述代码时,我得到了错误(通过捕获的 SQLException 的 toString()):

org.postgresql.util.PSQLException: 错误: 关系 “table__final__records”不存在。

上面代码中指定的每个大写字符在抛出异常的文本中显示为小写。

如果我手动将数据库表重命名为全部小写,则错误消除,无需更改代码。但是它被替换为:

org.postgresql.util.PSQLException:错误:列“日期时间”的 关系“table_final_records”不存在

一个明显的解决方法是将 Postgres 数据库中所有表名和列名中的所有大写字符手动转换为小写,但是我想知道如何在此类语句上强制区分大小写,以便 PostgreSQL 数据库可以正确识别和更新带有大写字符的表名和列名。

谢谢

【问题讨论】:

标签: java sql postgresql jdbc


【解决方案1】:

您可以通过在查询中引用标识符来解决此问题:

PreparedStatement st = conn.prepareStatement(
    "INSERT INTO \"TABLE_Final_Records\"(\"Datetime\", \"Number_n\", \"Fraction_f\")" 
    + " VALUES (?,?,?)" 
);

但底线:您遇到的问题表明您的数据库表和列是用双引号围绕标识符创建的。通常,您希望在声明标识符时避免引用它们,因为这会使它们区分大小写 - 正如您所遇到的那样,这会使编写查询变得乏味且冗长。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 2020-04-26
    相关资源
    最近更新 更多