【问题标题】:PostgreSQL JDBC PreparedStatement's setBytes changes parameter valuePostgreSQL JDBC PreparedStatement 的 setBytes 更改参数值
【发布时间】:2015-04-27 00:40:09
【问题描述】:

我有一个包含 bytea 列的 PostgreSQL 表。例如:

CREATE TABLE my_table (
   text_col text NOT NULL,
   bytea_col bytea NOT NULL
);

插入到表中使用PreparedStatement 类似这样的东西:

...
byte[] value = "ABC".getBytes();
String insertStmt = "INSERT INTO my_table (text_col, bytea_col) VALUES (?, ?)";    
PreparedStatement ps = conn.prepareStatement(insertStmt);
ps.setString(1, "SomeString");
ps.setBytes(2, value);
...

当字符串ABC 的字节[] 被打印出来时,它是:[65 66 67]。 但是,当我查看数据库中插入的值时,它是:\x414243,我认为它相当于[41 42 43] 的一个字节[]。

因此,当我在 WHERE 子句中使用 [65 66 67] 进行查询时,永远找不到该行。

select * from my_table where bytes_col = E'\\x656667';

PreparedStatement 中的 setBytes 是否会更改我传入的字节?这似乎是错误的。我做错了什么吗?

【问题讨论】:

    标签: java postgresql jdbc prepared-statement


    【解决方案1】:

    当我查看数据库中插入的值时,它是:\x414243,我假设它相当于 [41 42 43] 的 byte[]

    那将是一个错误的假设。 \x 表示数据以十六进制格式显示。因此\x414243 等价于[ 0x41, 0x42, 0x43 ]byte[]。在十进制中,这是[ 65, 66, 67 ],在任何基础上,这些都是“A”、“B”和“C”的 ASCII 代码。您的数据已正确存储。您对它的查询不正确。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      • 2021-11-12
      • 2012-09-26
      • 2018-10-25
      • 2017-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多