diff --git a/pgjdbc/src/main/java/org/postgresql/core/v3/ConnectionFactoryImpl.java b/pgjdbc/src/main/java/org/postgresql/core/v3/ConnectionFactoryImpl.java index 75a18ef..8f9f4b8 100644 --- a/pgjdbc/src/main/java/org/postgresql/core/v3/ConnectionFactoryImpl.java +++ b/pgjdbc/src/main/java/org/postgresql/core/v3/ConnectionFactoryImpl.java @@ -75,21 +75,6 @@ public class ConnectionFactoryImpl extends ConnectionFactory { private int protocolVerion = PROTOCOL_VERSION_351; private String connectInfo = ""; - /** - * Whitelist of supported client_encoding - */ - public static final HashMap CLIENT_ENCODING_WHITELIST = new HashMap<>(); - - static { - CLIENT_ENCODING_WHITELIST.put("UTF8", "UTF8"); - CLIENT_ENCODING_WHITELIST.put("UTF-8", "UTF-8"); - CLIENT_ENCODING_WHITELIST.put("GBK", "GBK"); - CLIENT_ENCODING_WHITELIST.put("GB18030", "GB18030"); - CLIENT_ENCODING_WHITELIST.put("LATIN1", "LATIN1"); - } -// public static void setStaticClientEncoding(String client) { -// this.CLIENT_ENCODING = client; -// } public void setClientEncoding(String client) { this.CLIENT_ENCODING = client; } @@ -179,13 +164,7 @@ public class ConnectionFactoryImpl extends ConnectionFactory { public QueryExecutor openConnectionImpl(HostSpec[] hostSpecs, String user, String database, Properties info) throws SQLException { if (info.getProperty("characterEncoding") != null) { - if (CLIENT_ENCODING_WHITELIST.containsKey((info.getProperty("characterEncoding")).toUpperCase(Locale.ENGLISH))) { - setClientEncoding(info.getProperty("characterEncoding").toUpperCase(Locale.ENGLISH)); - } else { - LOGGER.warn("unsupported client_encoding: " + info.getProperty( - "characterEncoding") + ", to ensure correct operation, please use the specified range " + - "of client_encoding."); - } + setClientEncoding(info.getProperty("characterEncoding").toUpperCase(Locale.ENGLISH)); } if (info.getProperty("use_boolean") != null) { diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/EncodingTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/EncodingTest.java new file mode 100644 index 0000000..404ef6f --- /dev/null +++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/EncodingTest.java @@ -0,0 +1,76 @@ +package org.postgresql.test.jdbc4; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.postgresql.test.TestUtil; + +import java.sql.*; +import java.util.Properties; + +import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; + +public class EncodingTest { + + private Connection con; + + @After + public void tearDown() throws Exception { + TestUtil.closeDB(con); + } + + /* + * Tests encoding change + */ + @Test + public void testEncodingChange() throws Exception { + Properties properties = new Properties(); + properties.put("characterEncoding", "SQL_ASCII"); + con = TestUtil.openDB(properties); + + Statement stmt = con.createStatement(); + ResultSet rs = stmt.executeQuery("show client_encoding"); + + assertTrue(rs.next()); + String e = rs.getString(1); + assertNotNull(e); + assertEquals("SQL_ASCII", e); + + TestUtil.createTable(con, "test_encode", "id varchar"); + String str = "abcde1234l&&&&&7$$"; + PreparedStatement pstmt = con.prepareStatement("INSERT INTO test_encode VALUES (?);"); + pstmt.setObject(1, str, Types.VARCHAR); + pstmt.executeUpdate(); + ResultSet rsv = stmt.executeQuery("SELECT id FROM test_encode;"); + assertTrue(rsv.next()); + String s = rsv.getString(1); + assertNotNull(s); + assertEquals(str, s); + TestUtil.dropTable(con, "test_encode"); + + Properties properties2 = new Properties(); + properties2.put("characterEncoding", "GBK"); + con = TestUtil.openDB(properties2); + + Statement stmt2 = con.createStatement(); + ResultSet rs2 = stmt2.executeQuery("show client_encoding"); + + assertTrue(rs2.next()); + String e2 = rs2.getString(1); + assertNotNull(e2); + assertEquals("GBK", e2); + + Properties properties3 = new Properties(); + properties3.put("characterEncoding", "LATIN2"); + con = TestUtil.openDB(properties3); + + Statement stmt3 = con.createStatement(); + ResultSet rs3 = stmt3.executeQuery("show client_encoding"); + + assertTrue(rs3.next()); + String e3 = rs3.getString(1); + assertNotNull(e3); + assertEquals("LATIN2", e3); + } +}