Различные форматы результатов при вставке результата функции postgreSQL между JDBC и консолью - PullRequest
0 голосов
/ 08 мая 2018

В postgreSQL я использую модуль pgcrypto для вызова функции pgp_sym_encrypt (возвращает тип байта) и сохраняю результат в текстовом столбце:

Например, у меня есть тест таблица со столбцом столбец A (текст):

CREATE EXTENSION pgcrypto;
insert into test (columnA) values (pgp_sym_encrypt('test','test'));

Если я запускаю в консоли, результат будет похож на (экранированный двоичный файл):

\303\015\004\007\003\002\022\261B\015\376\235\023\010j\3225\001\244l\253\332\026\037\\Q\305\253\365H\264\222\021\233\345\326\036Ma\346vwq\373\201\303\300\000\303\354\327:\017\020\036Q\201\025\210\364%\215$\017\304Y^_&\267

Если я запускаю в JDBC, результат аналогичен (в шестнадцатеричном формате):

public class Main {
    public static void main(String[] args) throws Exception {
        Class.forName("org.postgresql.Driver");
        Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/db", "postgres", "postgres");
        Statement stmt = connection.createStatement();
        String sql = "insert into test (columnA) values (pgp_sym_encrypt('test','test'))";
        stmt.executeUpdate(sql);
        connection.close();
    }
}

Результат:

\xc30d040703026859a0885a496bc66bd240018d9cbede4805fc5b733afc706d061ae613600962222f008ab2fc4e99cc1c87841e3929833066ba42697784276c49efa67655a399fa9f77264769a42eb7c85e

Если я использую pgp_sym_decrypt для дешифрования, оба дешифруются бегло, но мне интересно, почему результаты в разных форматах. Если я хочу тот же формат, как я могу это сделать?

UPDATE: Я знаю, что это экранированный и шестнадцатеричный формат, и их можно установить как ответ @Vao Tsun. Но мне интересно, почему, я думал, что они должны использовать тот же формат по умолчанию? Формат переопределения JDBC? Существует ли какая-либо конфигурация для JDBC для этого формата по умолчанию, или мне приходится вызывать оператор set в каждой транзакции?

1 Ответ

0 голосов
/ 08 мая 2018

Это зависит от настроек вашего клиента:

so=# set bytea_output to escape;
SET    
so=# select '\xc30d040703026859a0885a496bc66bd240018d9cbede4805fc5b733afc706d061ae613600962222f008ab2fc4e99cc1c87841e3929833066ba42697784276c49efa67655a399fa9f77264769a42eb7c85e'::bytea;
                                                                                                          bytea
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 \303\015\004\007\003\002hY\240\210ZIk\306k\322@\001\215\234\276\336H\005\374[s:\374pm\006\032\346\023`\011b"/\000\212\262\374N\231\314\034\207\204\0369)\2030f\272Biw\204'lI\357\246vU\243\231\372\237w&Gi\244.\267\310^
(1 row)

Time: 0.487 ms
so=# set bytea_output to hex;
SET
Time: 2.134 ms
so=# select '\xc30d040703026859a0885a496bc66bd240018d9cbede4805fc5b733afc706d061ae613600962222f008ab2fc4e99cc1c87841e3929833066ba42697784276c49efa67655a399fa9f77264769a42eb7c85e'::bytea;
                                                                                bytea
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
 \xc30d040703026859a0885a496bc66bd240018d9cbede4805fc5b733afc706d061ae613600962222f008ab2fc4e99cc1c87841e3929833066ba42697784276c49efa67655a399fa9f77264769a42eb7c85e
(1 row)

https://www.postgresql.org/docs/current/static/runtime-config-client.html#GUC-BYTEA-OUTPUT

Устанавливает формат вывода для значений типа bytea.Допустимые значения: hex (по умолчанию) и escape (традиционный формат PostgreSQL).См. Раздел 8.4 для получения дополнительной информации.Тип bytea всегда принимает оба формата на входе, независимо от этого параметра.

update

Вы можете установить этот параметр для пользователя alter user vao set bytea_output to hex или для базы данныхили даже для кластера, а не только для сеанса или транзакции.Вы определенно не должны запускать его перед каждым утверждением, если вы, конечно, не хотите.

Относительно того, имеет ли jdbc особые настройки - я не знаю, на самом деле, вы можете передать настройки клиента в строке подключения.

Наконец, если вы измените его для каждого пользователя / дБ, вам нужно будет повторно подключиться для эффекта.И SET LOCAL/SESSION сразу преодолеет этот параметр ...

...