如何使用Oracle jdbc驱动程序的fixedString属性?

时间:2009-03-26 18:30:32

标签: java oracle jdbc

Oracle填充char列中的值,所以如果我在CHAR(2)列中插入“a”,那么我无法通过将该列与“a”进行比较来获取该记录,我应该通过将其与“a”进行比较来获得该记录。正确?

要解决此问题,Oracle jdbc驱动程序具有属性fixedString但我无法使其工作。 (寻找 fixedString here

我正在使用Oracle 10gR2的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又是空的。 我缺少什么?

提前致谢

3 个答案:

答案 0 :(得分:2)

尝试将其用作

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

Oracle文档将fixedString称为String(包含布尔值)

答案 1 :(得分:1)

对于数据库中每个条目的长度相同的字符串,只应使用CHAR。将VARCHAR用于可变长度字符串。

答案 2 :(得分:1)

oracle docs真的很令人愤怒。在你的问题之前我从来没有听说过这个问题(我喜欢这个网站的一个方面)。调查了这一点,发现了一些引用它会使用“FIXED CHAR”语义的引用,但没有描述它们如何工作或者你的预期返回值是什么,只有关于匹配和相等的行为。你能用“喜欢”做查询吗? (当然慢得多)关闭该查询的固定字符语义?仅将修剪后的值插入db?

引用hereherehere