【问题标题】:Oracle JDBC PreparedStatement Ignore Trailing SpacesOracle JDBC PreparedStatement 忽略尾随空格
【发布时间】:2014-10-09 15:56:46
【问题描述】:

我目前正在编写一个与 Oracle 数据库交互的 Java Web 应用程序。我使用 PreparedStatements 是因为 Hibernate 会使事情变得过于复杂。

由于正在写入数据库的程序中存在错误,我需要搜索的字段在值中写入了尾随空格。我用引号将值括起来以显示空格。

"testFTP_receipt521      "

当我使用 SQLDeveloper 进行选择查询时,我能够在运行时得到结果:

...and yfs_organization.ORGANIZATION_KEY='testFTP_receipt521';

(无空格)

但是,当我使用 PreparedStatement 时,我尝试时没有得到任何结果:

...and yfs_organization.ORGANIZATION_KEY=?");
preparedStatement.setString(1, "testFTP_receipt521");

(无空格)

当我尝试时:

...and yfs_organization.ORGANIZATION_KEY=?");
preparedStatement.setString(1, "testFTP_receipt521      ");

(带空格)

有什么方法可以使用 PreparedStatement 查询此结果,还是应该尝试其他方法?

感谢您的所有帮助。

【问题讨论】:

  • 我确实考虑过,但是除了我想要的结果之外,这可能会返回 testFTP_receipt521_test。
  • 你可以试试TRIM(yfs_organization.ORGANIZATION_KEY)=?

标签: java oracle jdbc


【解决方案1】:

由于正在写入数据库的程序中的错误,我需要搜索的字段有尾随空格

也许,考虑到具体情况,并且如果您的 Oracle 版本足够新,您可能会考虑将 virtual column 添加到包含 正确 值的表中?

ALTER TABLE yfs_organization ADD (
  ORGANIZATION_KEY_FIXED VARCHAR(80)
    GENERATED ALWAYS AS (TRIM(ORGANIZATION_KEY)) VIRTUAL
  );

那么在您的代码中,唯一的变化是使用ORGANIZATION_KEY_FIXED 来查询数据库:

SELECT ID,ORGANIZATION_KEY_FIXED
  FROM yfs_organization
  WHERE ORGANIZATION_KEY_FIXED='testFTP_receipt521'

(试试http://sqlfiddle.com/#!4/8251d/1

这可能会避免在您的应用程序中分散解决该错误所需的代码。一旦它被修复,它可能会缓解过渡。

作为额外的好处,如果需要,您还可以在虚拟列上添加索引。

【讨论】:

    【解决方案2】:

    也许你可以这样使用它......

    ...and yfs_organization.ORGANIZATION_KEY like '%testFTP_receipt521%';
    

    这种方式会返回所有包含“testFTP_receipt521”的reg,独立于空格。

    我在这部分的代码中看到的另一件事

    ...and yfs_organization.ORGANIZATION_KEY=?");
    preparedStatement.setString(1, "testFTP_receipt521");
    

    我觉得这是正确的方法

    ...and yfs_organization.ORGANIZATION_KEY='?'");
    

    您需要在条件周围加上引号

    【讨论】:

      【解决方案3】:

      如果您有能力修改查询,您可以 TRIM(...) 列值并执行比较。例如:

      ...和 ​​TRIM(yfs_organization.ORGANIZATION_KEY)=?");

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-11
        • 2015-11-15
        • 1970-01-01
        • 2019-11-21
        • 1970-01-01
        相关资源
        最近更新 更多