Vì Java sử dụng mã hóa UNICODE (UTF-16) bên trong, nên sẽ không bình thường khi sử dụng client_encoding
khác với UTF8
trong trình điều khiển PostgreSQL JDBC.
Do đó, nó buộc client_encoding
với các giá trị đó, hãy xem org.postgresql.core.v3.ConnectionFactoryImpl.getParametersForStartup
:
private List<String[]> getParametersForStartup(String user, String database, Properties info) {
List<String[]> paramList = new ArrayList<String[]>();
paramList.add(new String[]{"user", user});
paramList.add(new String[]{"database", database});
paramList.add(new String[]{"client_encoding", "UTF8"});
paramList.add(new String[]{"DateStyle", "ISO"});
[...]
Trên thực tế, nếu mã hóa ứng dụng được thay đổi thành bất kỳ thứ gì khác, trình điều khiển JDBC thể hiện sự không vui của nó không có điều khoản không chắc chắn:
public void receiveParameterStatus() throws IOException, SQLException {
// ParameterStatus
pgStream.receiveInteger4(); // MESSAGE SIZE
String name = pgStream.receiveString();
String value = pgStream.receiveString();
[...]
if (name.equals("client_encoding")) {
if (allowEncodingChanges) {
if (!value.equalsIgnoreCase("UTF8") && !value.equalsIgnoreCase("UTF-8")) {
LOGGER.log(Level.FINE,
"pgjdbc expects client_encoding to be UTF8 for proper operation. Actual encoding is {0}",
value);
}
pgStream.setEncoding(Encoding.getDatabaseEncoding(value));
} else if (!value.equalsIgnoreCase("UTF8") && !value.equalsIgnoreCase("UTF-8")) {
close(); // we're screwed now; we can't trust any subsequent string.
throw new PSQLException(GT.tr(
"The server''s client_encoding parameter was changed to {0}. The JDBC driver requires client_encoding to be UTF8 for correct operation.",
value), PSQLState.CONNECTION_FAILURE);
}
}
Bạn có thể gặp sự cố chuyển đổi mã hóa khi bạn đọc dữ liệu vào chương trình Java của mình; hãy thử và khắc phục sự cố ở đó.