PostgreSQL JDBC PreparedStatement的setBytes更改参数值

时间:2015-04-27 00:40:09

标签: java postgresql jdbc prepared-statement

我有一个包含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]的byte []。

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

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

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

1 个答案:

答案 0 :(得分:1)

  

当我查看数据库中的插入值时,它是:\ x414243,我认为,相当于[41 42 43]的字节[]

这将是一个错误的假设。 \x表示数据以十六进制格式显示。因此\x414243相当于byte[] [ 0x41, 0x42, 0x43 ]。在十进制中,即[ 65, 66, 67 ],在任何基础上,这些都是' A',' B'和' C&#39的ASCII代码;。您的数据存储正确。您的查询不正确。