From: Date: October 27 2006 11:13pm Subject: Connector/J commit: r5949 - in branches/branch_5_0/connector-j: . src/com/mysql/jdbc src/testsuite/regression List-Archive: http://lists.mysql.com/commits/14506 X-Bug: 23645 Message-Id: <200610272113.k9RLDJHw011947@bk-internal.mysql.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modified: branches/branch_5_0/connector-j/CHANGES branches/branch_5_0/connector-j/src/com/mysql/jdbc/CharsetMapping.java branches/branch_5_0/connector-j/src/testsuite/regression/StringRegressionTest.java Log: Fixed BUG#23645 - Some collations/character sets reported as "unknown" (specifically cias variants of existing character sets), and inability to override the detected server character set. Modified: branches/branch_5_0/connector-j/CHANGES =================================================================== --- branches/branch_5_0/connector-j/CHANGES 2006-10-27 21:12:32 UTC (rev 5948) +++ branches/branch_5_0/connector-j/CHANGES 2006-10-27 21:13:18 UTC (rev 5949) @@ -1,6 +1,17 @@ # Changelog # $Id$ +nn-nn-06 - Version 5.0.5 + + - Fixed BUG#23645 - Some collations/character sets reported as "unknown" + (specifically cias variants of existing character sets), and inability to override + the detected server character set. + + - Performance enhancement of initial character set configuration, driver + will only send commands required to configure connection character set + session variables if the current values on the server do not match + what is required. + 10-20-06 - Version 5.0.4 - Fixed BUG#21379 - column names don't match metadata in cases Modified: branches/branch_5_0/connector-j/src/com/mysql/jdbc/CharsetMapping.java =================================================================== --- branches/branch_5_0/connector-j/src/com/mysql/jdbc/CharsetMapping.java 2006-10-27 21:12:32 UTC (rev 5948) +++ branches/branch_5_0/connector-j/src/com/mysql/jdbc/CharsetMapping.java 2006-10-27 21:13:18 UTC (rev 5949) @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2004 MySQL AB + Copyright (C) 2002-2006 MySQL AB This program is free software; you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as @@ -34,7 +34,6 @@ import java.util.Map; import java.util.Properties; import java.util.Set; -import java.util.SortedSet; /** * Mapping between MySQL charset names and Java charset names. I've investigated @@ -63,6 +62,8 @@ private static final Map MULTIBYTE_CHARSETS; private static final Map MYSQL_TO_JAVA_CHARSET_MAP; + + private static final String NOT_USED = "ISO8859_1"; // punting for not-used character sets static { @@ -103,8 +104,8 @@ + "ISO8859_13 = estonia," + "Cp437 = *>4.1.0 cp850," + "Cp437 = dos," - + "Cp850 = Cp850," - + "Cp852 = Cp852," + + "Cp850 = cp850," + + "Cp852 = cp852," + "Cp866 = cp866," + "KOI8_R = koi8_ru," + "KOI8_R = >4.1.0 koi8r," @@ -240,18 +241,18 @@ try { INDEX_TO_CHARSET[1] = getJavaEncodingForMysqlEncoding("big5", null); INDEX_TO_CHARSET[2] = getJavaEncodingForMysqlEncoding("czech", null); - INDEX_TO_CHARSET[3] = getJavaEncodingForMysqlEncoding("dec8", null); - INDEX_TO_CHARSET[4] = getJavaEncodingForMysqlEncoding("dos", null); + INDEX_TO_CHARSET[3] = "ISO8859_1"; // punting for "dec8" + INDEX_TO_CHARSET[4] = "ISO8859_1"; // punting for "dos" INDEX_TO_CHARSET[5] = getJavaEncodingForMysqlEncoding("german1", null); - INDEX_TO_CHARSET[6] = getJavaEncodingForMysqlEncoding("hp8", null); + INDEX_TO_CHARSET[6] = "ISO8859_1"; // punting for "hp8" INDEX_TO_CHARSET[7] = getJavaEncodingForMysqlEncoding("koi8_ru", null); INDEX_TO_CHARSET[8] = getJavaEncodingForMysqlEncoding("latin1", null); INDEX_TO_CHARSET[9] = getJavaEncodingForMysqlEncoding("latin2", null); - INDEX_TO_CHARSET[10] = getJavaEncodingForMysqlEncoding("swe7", null); + INDEX_TO_CHARSET[10] = "ISO8859_1"; // punting for "swe7" INDEX_TO_CHARSET[11] = getJavaEncodingForMysqlEncoding("usa7", null); INDEX_TO_CHARSET[12] = getJavaEncodingForMysqlEncoding("ujis", null); INDEX_TO_CHARSET[13] = getJavaEncodingForMysqlEncoding("sjis", null); @@ -261,6 +262,9 @@ null); INDEX_TO_CHARSET[16] = getJavaEncodingForMysqlEncoding("hebrew", null); + + INDEX_TO_CHARSET[17] = NOT_USED; // not used in the server + INDEX_TO_CHARSET[18] = getJavaEncodingForMysqlEncoding("tis620", null); INDEX_TO_CHARSET[19] = getJavaEncodingForMysqlEncoding("euc_kr", @@ -269,8 +273,7 @@ null); INDEX_TO_CHARSET[21] = getJavaEncodingForMysqlEncoding("hungarian", null); - INDEX_TO_CHARSET[22] = getJavaEncodingForMysqlEncoding("koi8_ukr", - null); + INDEX_TO_CHARSET[22] = "KOI8_R"; //punting for "koi8_ukr" INDEX_TO_CHARSET[23] = getJavaEncodingForMysqlEncoding( "win1251ukr", null); INDEX_TO_CHARSET[24] = getJavaEncodingForMysqlEncoding("gb2312", @@ -288,60 +291,62 @@ null); INDEX_TO_CHARSET[31] = getJavaEncodingForMysqlEncoding("latin1_de", null); - INDEX_TO_CHARSET[32] = getJavaEncodingForMysqlEncoding("armscii8", - null); + INDEX_TO_CHARSET[32] = "ISO8859_1"; // punting "armscii8" INDEX_TO_CHARSET[33] = getJavaEncodingForMysqlEncoding("utf8", null); - INDEX_TO_CHARSET[34] = getJavaEncodingForMysqlEncoding("win1250ch", - null); + INDEX_TO_CHARSET[34] = "Cp1250"; // punting "win1250ch" INDEX_TO_CHARSET[35] = getJavaEncodingForMysqlEncoding("ucs2", null); INDEX_TO_CHARSET[36] = getJavaEncodingForMysqlEncoding("cp866", null); - INDEX_TO_CHARSET[37] = getJavaEncodingForMysqlEncoding("keybcs2", - null); + INDEX_TO_CHARSET[37] = "Cp895"; // punting "keybcs2" INDEX_TO_CHARSET[38] = getJavaEncodingForMysqlEncoding("macce", null); INDEX_TO_CHARSET[39] = getJavaEncodingForMysqlEncoding("macroman", null); - INDEX_TO_CHARSET[40] = getJavaEncodingForMysqlEncoding("pclatin2", - null); + INDEX_TO_CHARSET[40] = "latin2"; // punting "pclatin2" INDEX_TO_CHARSET[41] = getJavaEncodingForMysqlEncoding("latvian", null); INDEX_TO_CHARSET[42] = getJavaEncodingForMysqlEncoding("latvian1", null); - INDEX_TO_CHARSET[43] = getJavaEncodingForMysqlEncoding("maccebin", + INDEX_TO_CHARSET[43] = getJavaEncodingForMysqlEncoding("macce", null); - INDEX_TO_CHARSET[44] = getJavaEncodingForMysqlEncoding("macceciai", + INDEX_TO_CHARSET[44] = getJavaEncodingForMysqlEncoding("macce", null); - INDEX_TO_CHARSET[45] = getJavaEncodingForMysqlEncoding("maccecias", + INDEX_TO_CHARSET[45] = getJavaEncodingForMysqlEncoding("macce", null); - INDEX_TO_CHARSET[46] = getJavaEncodingForMysqlEncoding("maccecsas", + INDEX_TO_CHARSET[46] = getJavaEncodingForMysqlEncoding("macce", null); - INDEX_TO_CHARSET[47] = getJavaEncodingForMysqlEncoding("latin1bin", + INDEX_TO_CHARSET[47] = getJavaEncodingForMysqlEncoding("latin1", null); INDEX_TO_CHARSET[48] = getJavaEncodingForMysqlEncoding( - "latin1cias", null); + "latin1", null); INDEX_TO_CHARSET[49] = getJavaEncodingForMysqlEncoding( - "latin1csas", null); - INDEX_TO_CHARSET[50] = getJavaEncodingForMysqlEncoding("cp1251bin", + "latin1", null); + INDEX_TO_CHARSET[50] = getJavaEncodingForMysqlEncoding("cp1251", null); INDEX_TO_CHARSET[51] = getJavaEncodingForMysqlEncoding( - "cp1251cias", null); + "cp1251", null); INDEX_TO_CHARSET[52] = getJavaEncodingForMysqlEncoding( - "cp1251csas", null); + "cp1251", null); INDEX_TO_CHARSET[53] = getJavaEncodingForMysqlEncoding( - "macromanbin", null); + "macroman", null); INDEX_TO_CHARSET[54] = getJavaEncodingForMysqlEncoding( - "macromancias", null); + "macroman", null); INDEX_TO_CHARSET[55] = getJavaEncodingForMysqlEncoding( - "macromanciai", null); + "macroman", null); INDEX_TO_CHARSET[56] = getJavaEncodingForMysqlEncoding( - "macromancsas", null); + "macroman", null); INDEX_TO_CHARSET[57] = getJavaEncodingForMysqlEncoding("cp1256", null); + + INDEX_TO_CHARSET[58] = NOT_USED; // not used + INDEX_TO_CHARSET[59] = NOT_USED; // not used + INDEX_TO_CHARSET[60] = NOT_USED; // not used + INDEX_TO_CHARSET[61] = NOT_USED; // not used + INDEX_TO_CHARSET[62] = NOT_USED; // not used + INDEX_TO_CHARSET[63] = getJavaEncodingForMysqlEncoding("binary", null); - INDEX_TO_CHARSET[64] = getJavaEncodingForMysqlEncoding("armscii", - null); + INDEX_TO_CHARSET[64] = "ISO8859_2"; // punting "armscii" INDEX_TO_CHARSET[65] = getJavaEncodingForMysqlEncoding("ascii", null); INDEX_TO_CHARSET[66] = getJavaEncodingForMysqlEncoding("cp1250", @@ -350,18 +355,19 @@ null); INDEX_TO_CHARSET[68] = getJavaEncodingForMysqlEncoding("cp866", null); - INDEX_TO_CHARSET[69] = getJavaEncodingForMysqlEncoding("dec8", null); + INDEX_TO_CHARSET[69] = "US-ASCII"; // punting for "dec8" INDEX_TO_CHARSET[70] = getJavaEncodingForMysqlEncoding("greek", null); INDEX_TO_CHARSET[71] = getJavaEncodingForMysqlEncoding("hebrew", null); - INDEX_TO_CHARSET[72] = getJavaEncodingForMysqlEncoding("hp8", null); - INDEX_TO_CHARSET[73] = getJavaEncodingForMysqlEncoding("keybcs2", - null); + INDEX_TO_CHARSET[72] = "US-ASCII"; // punting for "hp8" + INDEX_TO_CHARSET[73] = "Cp895"; // punting for "keybcs2" INDEX_TO_CHARSET[74] = getJavaEncodingForMysqlEncoding("koi8r", null); - INDEX_TO_CHARSET[75] = getJavaEncodingForMysqlEncoding("koi8ukr", - null); + INDEX_TO_CHARSET[75] = "KOI8_r"; // punting for koi8ukr" + + INDEX_TO_CHARSET[76] = NOT_USED; // not used + INDEX_TO_CHARSET[77] = getJavaEncodingForMysqlEncoding("latin2", null); INDEX_TO_CHARSET[78] = getJavaEncodingForMysqlEncoding("latin5", @@ -372,7 +378,7 @@ null); INDEX_TO_CHARSET[81] = getJavaEncodingForMysqlEncoding("cp852", null); - INDEX_TO_CHARSET[82] = getJavaEncodingForMysqlEncoding("swe7", null); + INDEX_TO_CHARSET[82] = "ISO8859_1"; // punting for "swe7" INDEX_TO_CHARSET[83] = getJavaEncodingForMysqlEncoding("utf8", null); INDEX_TO_CHARSET[84] = getJavaEncodingForMysqlEncoding("big5", null); INDEX_TO_CHARSET[85] = getJavaEncodingForMysqlEncoding("euckr", @@ -385,10 +391,8 @@ null); INDEX_TO_CHARSET[90] = getJavaEncodingForMysqlEncoding("ucs2", null); INDEX_TO_CHARSET[91] = getJavaEncodingForMysqlEncoding("ujis", null); - INDEX_TO_CHARSET[92] = getJavaEncodingForMysqlEncoding("geostd8", - null); - INDEX_TO_CHARSET[93] = getJavaEncodingForMysqlEncoding("geostd8", - null); + INDEX_TO_CHARSET[92] = "US-ASCII"; //punting for "geostd8" + INDEX_TO_CHARSET[93] = "US-ASCII"; // punting for "geostd8" INDEX_TO_CHARSET[94] = getJavaEncodingForMysqlEncoding("latin1", null); INDEX_TO_CHARSET[95] = getJavaEncodingForMysqlEncoding("cp932", @@ -400,6 +404,10 @@ INDEX_TO_CHARSET[98] = getJavaEncodingForMysqlEncoding("eucjpms", null); + for (int i = 99; i < 128; i++) { + INDEX_TO_CHARSET[i] = NOT_USED; // not used + } + INDEX_TO_CHARSET[128] = getJavaEncodingForMysqlEncoding("ucs2", null); INDEX_TO_CHARSET[129] = getJavaEncodingForMysqlEncoding("ucs2", @@ -439,6 +447,10 @@ INDEX_TO_CHARSET[146] = getJavaEncodingForMysqlEncoding("ucs2", null); + for (int i = 147; i < 192; i++) { + INDEX_TO_CHARSET[i] = NOT_USED; // not used + } + INDEX_TO_CHARSET[192] = getJavaEncodingForMysqlEncoding("utf8", null); INDEX_TO_CHARSET[193] = getJavaEncodingForMysqlEncoding("utf8", @@ -478,6 +490,13 @@ INDEX_TO_CHARSET[210] = getJavaEncodingForMysqlEncoding("utf8", null); + // Sanity check + + for (int i = 1; i < INDEX_TO_CHARSET.length; i++) { + if (INDEX_TO_CHARSET[i] == null) { + throw new RuntimeException("Assertion failure: No mapping from charset index " + i + " to a Java character set"); + } + } } catch (SQLException sqlEx) { // ignore, it won't happen in this case } @@ -513,7 +532,7 @@ Collections.unmodifiableMap(tempMap); } - final static String getJavaEncodingForMysqlEncoding(String mysqlEncoding, + public final static String getJavaEncodingForMysqlEncoding(String mysqlEncoding, Connection conn) throws SQLException { if (conn != null && conn.versionMeetsMinimum(4, 1, 0) && @@ -524,7 +543,7 @@ return (String) MYSQL_TO_JAVA_CHARSET_MAP.get(mysqlEncoding); } - final static String getMysqlEncodingForJavaEncoding(String javaEncodingUC, + public final static String getMysqlEncodingForJavaEncoding(String javaEncodingUC, Connection conn) throws SQLException { List mysqlEncodings = (List) CharsetMapping.JAVA_UC_TO_MYSQL_CHARSET_MAP .get(javaEncodingUC); Modified: branches/branch_5_0/connector-j/src/testsuite/regression/StringRegressionTest.java =================================================================== --- branches/branch_5_0/connector-j/src/testsuite/regression/StringRegressionTest.java 2006-10-27 21:12:32 UTC (rev 5948) +++ branches/branch_5_0/connector-j/src/testsuite/regression/StringRegressionTest.java 2006-10-27 21:13:18 UTC (rev 5949) @@ -36,6 +36,7 @@ import testsuite.BaseTestCase; +import com.mysql.jdbc.CharsetMapping; import com.mysql.jdbc.StringUtils; /** @@ -835,4 +836,50 @@ assertEquals(this.rs.getString(1), codePage1252); } } + + /** + * Tests fix for BUG#23645 - Some collations/character sets reported as "unknown" + * (specifically cias variants of existing character sets), and inability to override + * the detected server character set. + * + * @throws Exception if the test fails. + */ + public void testBug23645() throws Exception { + if (versionMeetsMinimum(4, 1)) { + // Part of this isn't easily testable, hence the assertion in CharsetMapping + // that checks for mappings existing in both directions... + + // What we test here is the ability to override the character mapping + // when the server returns an "unknown" character encoding. + + String currentlyConfiguredCharacterSet = getSingleIndexedValueWithQuery(2, "SHOW VARIABLES LIKE 'character_set_connection'").toString(); + System.out.println(currentlyConfiguredCharacterSet); + + String javaNameForMysqlName = CharsetMapping.getJavaEncodingForMysqlEncoding(currentlyConfiguredCharacterSet, null); + System.out.println(javaNameForMysqlName); + + for (int i = 1; i < CharsetMapping.INDEX_TO_CHARSET.length; i++) { + String possibleCharset = CharsetMapping.INDEX_TO_CHARSET[i]; + + if (!javaNameForMysqlName.equals(possibleCharset)) { + System.out.println(possibleCharset); + + Properties props = new Properties(); + props.setProperty("characterEncoding", possibleCharset); + props.setProperty("com.mysql.jdbc.faultInjection.serverCharsetIndex", "65535"); + + Connection forcedCharConn = null; + + forcedCharConn = getConnectionWithProps(props); + + String forcedCharset = getSingleIndexedValueWithQuery(forcedCharConn, 2, "SHOW VARIABLES LIKE 'character_set_connection'").toString(); + + System.out.println(forcedCharset); + + break; + } + } + + } + } }