English 中文(简体)
如何使用Oracle jdbc驱动程序fixedString属性?
原标题:
  • 时间:2009-03-26 18:30:31
  •  标签:

Oracle在char列中填充值,因此如果我在CHAR(2)列中插入“a”,那么我不能通过将该列与“a”进行比较来获得该记录,我应该通过将其与“a”进行比较来获得它. 对吗?

为解决此问题,Oracle jdbc驱动程序具有fixedString属性,但我无法使其工作。 (在此处查找fixedString)

我正在使用ojdbc14.jar驱动程序访问Oracle 10gR2数据库。

这是我的代码:

    try {
        Properties props = new Properties();
        props.put("user", "****");
        props.put("password", "****");
        props.put("fixedString", true);

        Class.forName("oracle.jdbc.driver.OracleDriver");

        String jdbcUrl = "jdbc:oracle:thin:@<host>:<port>:<sid>";

        Connection connection = DriverManager.getConnection(jdbcUrl, props);

        PreparedStatement ps = connection.prepareStatement(
                           "SELECT * FROM MY_TABLE WHERE MY_TABLE_ID = ?");
        ps.setObject(1, "abc"); // (*)
        // MY_TABLE_ID is CHAR(15)

        ResultSet rs = ps.executeQuery();
        while (rs.next())
        {
            System.out.print("data: ");
            System.out.println(rs.getString("MY_TABLE_ID"));
        }
        rs.close();
        ps.close();
        connection.close();
    } catch (SQLException ex) {
        ex.printStackTrace();
    } catch (ClassNotFoundException ex) {
        ex.printStackTrace();
    }

以上代码执行良好(没有抛出异常),但执行executeQuery()后ResultSet为空。

如果我将(*)这行更改为

ps.setObject(1, "abc            ");

然后我得到了我想要的那一列。因此,看来驱动程序忽略了fixedString选项。

我也已经尝试更改 (*) 那一行。

ps.setObject(1, "abc", java.sql.Types.CHAR);

但我得到的ResultSet又是空的。 我错过了什么?

提前表示感谢 (Tíqián biǎoshì gǎnxiè)

最佳回答

尝试使用它作为

props.put("fixedString", "true");

Oracle的文档表示fixedString为String(包含布尔值)。

问题回答

您应该仅在数据库中每个条目的字符串长度相同的情况下使用CHAR。对于可变长度字符串,请使用VARCHAR。

Oracle文档真是令人恼火。在你的问题之前,我从未听说过这个东西(这个网站的一件事是我喜欢的)。我调查了一下,找到了一些提到它会使用“FIXED CHAR”语义的参考资料,但没有任何描述它们如何工作或预期返回值的内容,只有关于匹配和相等性的行为。你能使用“Like”来查询吗?(当然会更慢)为该查询关闭固定字符语义?只将修剪后的值插入数据库中?

参考资料在这里这里以及这里





相关问题
热门标签