Java 在JDBC&;之间插入postgreSQL函数结果时的不同结果格式;安慰

Java 在JDBC&;之间插入postgreSQL函数结果时的不同结果格式;安慰,java,sql,postgresql,jdbc,bytea,Java,Sql,Postgresql,Jdbc,Bytea,在postgreSQL中,我使用pgcrypto模块调用pgp\u sym\u encrypt函数(返回bytea类型),并将结果保存到文本列中: 例如,我有一个test表,其中列列a(文本): 如果在控制台中运行,结果类似于(转义二进制): 如果在JDBC中运行,结果类似于(十六进制格式): 结果: \xc30d040703026859a0885a496bc66bd240018d9cbede4805fc5b733afc706d061ae613600962222f008ab2fc4e99cc1c

在postgreSQL中,我使用pgcrypto模块调用pgp\u sym\u encrypt函数(返回bytea类型),并将结果保存到文本列中:

例如,我有一个test表,其中列列a(文本):

如果在控制台中运行,结果类似于(转义二进制):

如果在JDBC中运行,结果类似于(十六进制格式):

结果:

\xc30d040703026859a0885a496bc66bd240018d9cbede4805fc5b733afc706d061ae613600962222f008ab2fc4e99cc1c87841e3929833066ba42697784276c49efa67655a399fa9f77264769a42eb7c85e
如果我使用pgp_sym_decrypt进行解密,这两种方法都能顺利解密,但我想知道为什么结果的格式不同。如果我想要相同的格式,我该怎么办

更新:
我知道它们是转义格式和hext格式,可以设置为@Vao Tsun answer。但我想知道为什么,我认为他们必须使用相同的默认格式?JDBC是否覆盖了格式?是否有此默认格式的JDBC配置,或者我必须在每个事务中调用set语句?

这取决于您的客户端设置:

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)

设置bytea类型的值的输出格式。有效值为十六进制 (默认)和转义(传统的PostgreSQL格式)。看见 第8.4节了解更多信息。bytea类型始终接受这两种类型 在输入时设置格式,而不考虑此设置

更新

您可以将每个用户
将用户vao set bytea_output设置为十六进制,或每个数据库,甚至每个集群,而不仅仅是会话或事务。当然,如果你不想的话,你肯定不需要在每一个语句之前运行它

关于jdbc是否有特定的设置,我不知道,您可以在connect字符串中传递客户机设置


最后,如果您更改了每个用户/db,则需要重新连接才能生效。而
SET LOCAL/SESSION
将立即克服此参数…

我在问题中写道,我知道它们是转义格式&hext格式。我想知道为什么,我认为他们必须使用相同的默认格式?JDBC是否覆盖了格式?对于这种默认格式是否有JDBC配置,或者我必须在每个事务中调用set语句?我已经更新了我的问题。
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
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)