带有JDBC的Oracle CHAR列和尾随空格

时间:2015-08-21 07:12:55

标签: spring oracle jdbc datasource

我一直在阅读有关此问题的一些帖子,但我无法找到适合我环境的解决方案。

我使用的是Oracle Driver 11.2.0.3.0和Spring JDBC 4.1.4.RELEASE。

从这个site我得到Oracle默认情况下使用带有String参数的VARCHAR语义,这会产生我正在处理的错误(如果我将' a'与#39进行比较; a'它不匹配)。

理论上使用连接参数" fixedString = true"它应该解决问题。但是在我的datasource configuration中使用它并没有做出任何改变。

<bean id="dataSourcePool" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.user}" />
    <property name="password" value="${jdbc.password}" />
    <property name="connectionProperties" value="fixedString=true;" />
</bean>

我尝试使用OracleDataSource而不是commons,以防万一,但它没有用。

有人知道我在这里做错了吗?

感谢。

编辑:我找到了一种解决方法,它不是我想要的,但它没有参数&#34; fixedString&#34;。

在我在Spring JDBC中设置我的SQL参数之前(这是一个例子):

Map<String, Object> parameters = new HashMap<>();
parameters.put("newCharParemeter", "hello");
namedParameterJdbcTemplate.query(sql, parameters, new MyMapper());

调试类NamedParameterJdbcTemplate,我们发现Spring正在调用方法PreparedStatement.setString,因为它不知道参数的类型是什么&#34; newCharParameter&#34;。

如果我将之前的代码修改为:

Map<String, Object> parameters = new HashMap<>();
parameters.put("newCharParemeter", new SqlParameterValue(OracleTypes.FIXED_CHAR, "hello"));
namedParameterJdbcTemplate.query(sql, parameters, new MyMapper());

然后一切按预期工作,因为Spring调用PreparedStatement.setObject删除尾随空白,这要归功于类型FIXED_CHAR

1 个答案:

答案 0 :(得分:0)

尝试:

<property name="connectionProperties" value="fixedString='true';" />

<property name="connectionProperties">
    <props>
        <prop key="fixedString">true</prop>
    </props>
</property>

但可能最好的选择是将所有CHAR列转换为数据库中的VARCHAR。如果您在oracle中使用,例如。 CHAR(2)你必须插入2个字符,与2个字符比较等。