【问题标题】:Oracle CHAR column and trailing spaces with JDBC使用 JDBC 的 Oracle CHAR 列和尾随空格
【发布时间】:2015-11-15 01:10:58
【问题描述】:

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

我正在使用 Oracle 驱动程序 11.2.0.3.0 和 Spring JDBC 4.1.4.RELEASE。

site 我了解到 Oracle 默认使用带有字符串参数的 VARCHAR 语义,这会产生我正在处理的错误(如果我将 'a' 与 '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,但它不起作用。

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

谢谢。

编辑:我找到了一个解决方法,它不是我想要的,但它可以在没有参数“fixedString”的情况下工作。

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

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

调试NamedParameterJdbcTemplate类,发现Spring调用了PreparedStatement.setString方法,因为它不知道“newCharParameter”是什么类型的参数。

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

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

然后,由于 FIXED_CHAR 类型,Spring 调用 PreparedStatement.setObject 删除尾随空格,因此一切正常。

【问题讨论】:

  • 看看this post 是否有帮助。我有一个sample app,其中包含本文中提到的必要代码。
  • 我检查了你的帖子,但他们使用 Hibernate,我们使用 Spring JDBC。

标签: spring oracle jdbc datasource


【解决方案1】:

试试:

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

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

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

【讨论】:

  • 我一直在调试BasicDataSource类,setConnectionProperties调用正常,参数设置好了。将 CHAR 转换为 VARCHAR 不是一种选择。我认为问题可能出在JdbcTemplate,忽略了参数fixedString
  • 检查参数是否为字符串“真”而不是布尔真
  • 没关系,方法setConnectionProperties使用方法Properties.setProperty带String参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-08
  • 1970-01-01
  • 2010-12-17
  • 2019-04-05
  • 1970-01-01
  • 2021-04-08
  • 1970-01-01
相关资源
最近更新 更多