| Bug #61201 | Can't establish connection when url has sessionVariables and characterEncoding | ||
|---|---|---|---|
| Submitted: | 17 May 2011 13:46 | Modified: | 18 Jul 2011 15:04 |
| Reporter: | Arthur Du | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | Connector / J | Severity: | S3 (Non-critical) |
| Version: | 5.1.16 | OS: | Any |
| Assigned to: | CPU Architecture: | Any | |
| Tags: | sessionVariables characterEncoding | ||
[20 May 2011 13:03]
Tonci Grgin
Hi Arthur and thanks for your report.
True, there is a problem in MySQLIO.java, ln ~2095
if (characterEncoding != null) {
if (this.platformDbCharsetMatches) {
this.sendPacket.writeStringNoNull(query, characterEncoding,
this.connection.getServerCharacterEncoding(),
this.connection.parserKnowsUnicode(),
this.connection);
since this.connection.getServerCharacterEncoding() seems not to be initialized yet and by defining characterEncoding you are bound to enter this if.
[31 May 2011 23:50]
Brian Craft
Can verify that we are encountering this bug when using Atlassian Confluence and Jira with tomcat 6.0.32 and the URL -
url="jdbc:mysql://<host>:3306/jira_next?autoReconnect=true&useUnicode=true&characterEncoding=utf8&sessionVariables=storage_engine=InnoDB"
... 51 more
Caused by: java.lang.NullPointerException
at com.mysql.jdbc.ConnectionImpl.getServerCharacterEncoding(ConnectionImpl.java:3100)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2095)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2619)
... 56 more
[18 Jul 2011 15:04]
Tonci Grgin
Patch is pushed to revision 1077 but only for 4.1+ servers.
[22 Jul 2011 8:58]
Tonci Grgin
Additional changes pushed up to revision 1079. Server character set is determined from handshake rather than by parsing server variables.
[30 Sep 2011 1:59]
Philip Olson
Changelog entry for 5.1.18: + A connection could not be established when the + <acronym>URL</acronym> + contained both <literal>sessionVariables</literal> and + <literal>characterEncoding</literal>.

Description: DriverManager.getConnection("jdbc:mysql://localhost:3306/test?user=root&password=password&sessionVariables=FOREIGN_KEY_CHECKS=0&characterEncoding=utf8") Connection can't be established when the url has property "sessionVariables" and "characterEncoding" at the same time, but connection can be established when "sessionVariables" or "characterEncoding" is removed. I try version 5.1.14 and 5.1.15, they have no such problem. How to repeat: Java source code: Connection conn = null; try { conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?user=root&password=password&sessionVariables=FOREIGN_KEY_CHECKS=0&characterEncoding=utf8"); conn.close(); } catch (SQLException ex) { ex.printStackTrace(); // handle any errors System.out.println("SQLException: " + ex.getMessage()); System.out.println("SQLState: " + ex.getSQLState()); System.out.println("VendorError: " + ex.getErrorCode()); } Result: java.sql.SQLException: Unexpected exception encountered during query. at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2665) at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1698) at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1617) at com.mysql.jdbc.ConnectionImpl.setSessionVariables(ConnectionImpl.java:5210) at com.mysql.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:3375) at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2385) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2154) at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:792) at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305) at java.sql.DriverManager.getConnection(DriverManager.java:582) at java.sql.DriverManager.getConnection(DriverManager.java:207) at com.zubunet.test.App1.main(App1.java:14) Caused by: java.lang.NullPointerException at com.mysql.jdbc.ConnectionImpl.getServerCharacterEncoding(ConnectionImpl.java:3100) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2095) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2619) ... 18 more SQLException: Unexpected exception encountered during query. SQLState: S1000 VendorError: 0