2015-04-27 3 views
1

У меня есть таблица PostgreSQL, содержащая столбец bytea. Например:PostgreSQL JDBC PreparedStatement setBytes изменяет значение параметра

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].

Поэтому, когда я делаю запрос с использованием [65 66 67] в предложении WHERE, строка никогда не будет найдена.

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

Имеет ли setBytes в PreparedStatement изменениях байт, которые Переходят в? Это кажется неправильным. Я что-то делаю неправильно?

ответ

1

, когда я смотрю на вставленного значения в базе данных она: \ x414243, который, я полагаю, что эквивалентно байт [] из [41 42 43]

Это было бы дефектный предположение. \x указывает, что данные представлены в шестнадцатеричном формате. Таким образом, \x414243 эквивалентен byte[] от [ 0x41, 0x42, 0x43 ]. В десятичной форме это [ 65, 66, 67 ], и в любой базе это коды ASCII для «A», «B» и «C». Ваши данные сохранены правильно. Ваш запрос на это неверен.

Смежные вопросы