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;
+ }
+ }
+
+ }
+ }
}
| Thread |
|---|
| • Connector/J commit: r5949 - in branches/branch_5_0/connector-j: . src/com/mysql/jdbc src/testsuite/regression | mmatthews | 27 Oct |