在 JDBC 和控制台之间插入 postgreSQL 函数结果时的不同结果格式
Different result formats when insert postgreSQL function result between JDBC & console
在 postgreSQL 中,我使用 pgcrypto 模块调用 pgp_sym_encrypt 函数(return bytea 类型)和将结果保存到文本列中:
例如,我有 test table 列 columnA(text):
CREATE EXTENSION pgcrypto;
insert into test (columnA) values (pgp_sym_encrypt('test','test'));
如果我在控制台中 运行,结果类似于(转义二进制文件):
35[=12=]4[=12=]7[=12=]3[=12=]221B56530j25[=12=]14l3267\Q535H4213566Ma6vwq3130[=12=]0347:706Q1504%5$74Y^_&7
如果我在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解密,两者都解密流畅,但我想知道为什么结果格式不同。如果我想要相同的格式,我该怎么办?
更新:
我知道它们是转义格式和十六进制格式,可以设置为@Vao Tsun 的答案。但我想知道为什么,我认为他们必须使用相同的默认格式? JDBC 是否覆盖了格式?是否有针对此默认格式的 JDBC 的任何配置,或者我必须在每个事务中调用 set 语句?
这是你客户端设置的问题:
so=# set bytea_output to escape;
SET
so=# select '\xc30d040703026859a0885a496bc66bd240018d9cbede4805fc5b733afc706d061ae613600962222f008ab2fc4e99cc1c87841e3929833066ba42697784276c49efa67655a399fa9f77264769a42eb7c85e'::bytea;
bytea
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
35[=10=]4[=10=]7[=10=]3[=10=]2hY00ZIk6k2@[=10=]15466H[=10=]54[s:4pm[=10=]6263`1b"/[=10=]0224N1447469)30f2Biw4'lI76vU3127w&Gi4.70^
(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
Sets the output format for values of type bytea. Valid values are hex
(the default) and escape (the traditional PostgreSQL format). See
Section 8.4 for more information. The bytea type always accepts both
formats on input, regardless of this setting.
更新
您可以为每个用户 alter user vao set bytea_output to hex
或每个数据库甚至每个集群设置此设置,而不仅仅是会话或事务。当然,如果您不想,您绝对不必在每个语句之前都 运行 它。
关于 jdbc 是否有特定设置 - 我不知道,据我所知,您可以在连接字符串中传递客户端设置。
最后,如果您根据 user/db 更改它,则需要重新连接才能生效。而SET LOCAL/SESSION
会立刻克服这个参数...
在 postgreSQL 中,我使用 pgcrypto 模块调用 pgp_sym_encrypt 函数(return bytea 类型)和将结果保存到文本列中:
例如,我有 test table 列 columnA(text):
CREATE EXTENSION pgcrypto;
insert into test (columnA) values (pgp_sym_encrypt('test','test'));
如果我在控制台中 运行,结果类似于(转义二进制文件):
35[=12=]4[=12=]7[=12=]3[=12=]221B56530j25[=12=]14l3267\Q535H4213566Ma6vwq3130[=12=]0347:706Q1504%5$74Y^_&7
如果我在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解密,两者都解密流畅,但我想知道为什么结果格式不同。如果我想要相同的格式,我该怎么办?
更新: 我知道它们是转义格式和十六进制格式,可以设置为@Vao Tsun 的答案。但我想知道为什么,我认为他们必须使用相同的默认格式? JDBC 是否覆盖了格式?是否有针对此默认格式的 JDBC 的任何配置,或者我必须在每个事务中调用 set 语句?
这是你客户端设置的问题:
so=# set bytea_output to escape;
SET
so=# select '\xc30d040703026859a0885a496bc66bd240018d9cbede4805fc5b733afc706d061ae613600962222f008ab2fc4e99cc1c87841e3929833066ba42697784276c49efa67655a399fa9f77264769a42eb7c85e'::bytea;
bytea
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
35[=10=]4[=10=]7[=10=]3[=10=]2hY00ZIk6k2@[=10=]15466H[=10=]54[s:4pm[=10=]6263`1b"/[=10=]0224N1447469)30f2Biw4'lI76vU3127w&Gi4.70^
(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
Sets the output format for values of type bytea. Valid values are hex (the default) and escape (the traditional PostgreSQL format). See Section 8.4 for more information. The bytea type always accepts both formats on input, regardless of this setting.
更新
您可以为每个用户 alter user vao set bytea_output to hex
或每个数据库甚至每个集群设置此设置,而不仅仅是会话或事务。当然,如果您不想,您绝对不必在每个语句之前都 运行 它。
关于 jdbc 是否有特定设置 - 我不知道,据我所知,您可以在连接字符串中传递客户端设置。
最后,如果您根据 user/db 更改它,则需要重新连接才能生效。而SET LOCAL/SESSION
会立刻克服这个参数...