【问题标题】:PostgreSQL equivalent of oracle.sql.BLOB in JavaPostgreSQL 相当于 Java 中的 oracle.sql.BLOB
【发布时间】:2013-09-10 02:38:13
【问题描述】:

我有以下代码使用oracle.sql.BLOB

BLOB b = BLOB.createTemporary(conn, false, BLOB.DURATION_SESSION);
//conn is a PostgreSQL connection (java.sql.Connection object)
b.setBytes(1, someString.getBytes());
ps.setBlob(++i, b); //ps is a PreparedStatement

显然它不起作用,因为createTemporary 需要一个 Oracle 连接。

  1. 使用 Postgres 连接实现此目的的等效方法是什么?我了解 Blob 的 Postgres 等价物是 ByteA。目标列是bytea 列。我可以执行以下操作吗?或者有没有合适的方法达到同样的效果?

    ps.setBytes(++i, someString.getBytes());
    
  2. 另外,如何使特定于 Oracle 的代码与 DB 供应商无关? (避免使用oracle.sql.BLOB,即使是Oracle连接)

【问题讨论】:

  • 为什么要用BLOB来存储String?最好存储在CLOB(Postgres 中的text)中
  • 在此处查看我的答案:stackoverflow.com/a/8349906/330315 和此处stackoverflow.com/a/16462192/330315 以获得独立于 DBMS 的解决方案
  • @a_horse_with_no_name 这不是我的代码。程序员在这种情况下使用它是有原因的。我们不会对每个字符串都这样做。感谢您的链接。请问,setBinaryStreamsetBytes 好多少? setBytes 够吗?
  • 根据我的经验,setBinaryStream() 适用于所有 JDBC 驱动程序,而某些驱动程序不支持 setBytes()。如果您确切知道您将使用哪些驱动程序并且这些驱动程序也支持setBytes(),那么它没有任何问题。

标签: java sql oracle postgresql blob


【解决方案1】:

如果您确实使用了setBytes()(我不记得是否有其他 psql 或非 psql 特定的 blob 方法),请记住在您的 someString.getBytes() 中添加字符编码。

至于使您的代码独立于数据库,请停止使用数据库特定的类。仅使用 java.sql.* 类就可以走很长的路。当您必须深入研究实际实现的驱动程序类时,这应该只是一种特殊情况。

【讨论】:

  • 感谢您的 cmets。如果您也可以为这里的问题提供一些答案,那就太好了。
猜你喜欢
  • 1970-01-01
  • 2019-11-04
  • 2020-02-13
  • 2013-07-25
  • 1970-01-01
  • 2015-06-23
  • 1970-01-01
  • 2010-12-28
  • 2013-05-09
相关资源
最近更新 更多