PostgreSQL JDBC PreparedStatement 的 setBytes 更改参数值
PostgreSQL JDBC PreparedStatement's setBytes changes parameter value
我有包含 bytea
列的 PostgreSQL table。例如:
CREATE TABLE my_table (
text_col text NOT NULL,
bytea_col bytea NOT NULL
);
table 中的插入使用 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
的 byte[] 时,它是:[65 66 67]
。
但是,当我查看数据库中插入的值时,它是: \x414243
我认为它相当于 [41 42 43]
.
的 byte[]
因此,当我在 WHERE 子句中使用 [65 66 67]
进行查询时,从未找到该行。
select * from my_table where bytes_col = E'\x656667';
PreparedStatement
中的 setBytes
是否更改了我传入的字节?这似乎是错误的。我做错了什么吗?
when I look at the inserted value in the database it is: \x414243 which, I assume, is equivalent to a byte[] of [41 42 43]
这是一个错误的假设。 \x
表示数据以十六进制格式显示。因此 \x414243
等同于 [ 0x41, 0x42, 0x43 ]
的 byte[]
。在十进制中,这是 [ 65, 66, 67 ]
,在任何基数中,这些是 'A'、'B' 和 'C' 的 ASCII 代码。您的数据已正确存储。您的查询不正确。
我有包含 bytea
列的 PostgreSQL table。例如:
CREATE TABLE my_table (
text_col text NOT NULL,
bytea_col bytea NOT NULL
);
table 中的插入使用 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
的 byte[] 时,它是:[65 66 67]
。
但是,当我查看数据库中插入的值时,它是: \x414243
我认为它相当于 [41 42 43]
.
因此,当我在 WHERE 子句中使用 [65 66 67]
进行查询时,从未找到该行。
select * from my_table where bytes_col = E'\x656667';
PreparedStatement
中的 setBytes
是否更改了我传入的字节?这似乎是错误的。我做错了什么吗?
when I look at the inserted value in the database it is: \x414243 which, I assume, is equivalent to a byte[] of [41 42 43]
这是一个错误的假设。 \x
表示数据以十六进制格式显示。因此 \x414243
等同于 [ 0x41, 0x42, 0x43 ]
的 byte[]
。在十进制中,这是 [ 65, 66, 67 ]
,在任何基数中,这些是 'A'、'B' 和 'C' 的 ASCII 代码。您的数据已正确存储。您的查询不正确。