您的位置:首页 > 数据库 > MySQL

mysql处理Latin 中文繁体字乱码解决方案

2013-01-30 14:33 120 查看
问题描述:

1. 对于一些中文繁体字符select出来出现乱码,出问题的繁体字如:燈、龍等

环境描述:

数据库编码:

+--------------------------+----------------------------------------+

| Variable_name | Value |

+--------------------------+----------------------------------------+

| auto_increment_offset | 1 |

| character_set_client | latin1 |

| character_set_connection | latin1 |

| character_set_database | latin1 |

| character_set_filesystem | binary |

| character_set_results | latin1 |

| character_set_server | latin1 |

| character_set_system | utf8 |

| character_sets_dir | D:/Program Files/mysql/share/charsets/ |

+--------------------------+----------------------------------------+

数据库表编码:也同意使用latin1编码方式

由于数据库由DBA负责,并且库结构为了保持一致(我们使用备份库),从而不能修改数据库编码

问题排查:

1.mysql 的jdbc驱动源代码拷贝下来DEBUG,最终发现了问题根源在驱动中CharSetMapping.class该类中的getJavaEncodingForMysqlEncoding(String mysqlEncoding,Connection conn)方法,该方法源代码如下:

[java]
view plaincopyprint?

public final static String getJavaEncodingForMysqlEncoding(String mysqlEncoding,
Connection conn) throws SQLException {

if (conn != null && conn.versionMeetsMinimum(4, 1, 0) &&
"latin1".equalsIgnoreCase(mysqlEncoding)) {
return "Cp1252";
}

return (String) MYSQL_TO_JAVA_CHARSET_MAP.get(mysqlEncoding);
}

[java]
view plaincopyprint?

public final static String getJavaEncodingForMysqlEncoding(String mysqlEncoding,
Connection conn) throws SQLException {

if (conn != null && conn.versionMeetsMinimum(4, 1, 0) &&
"latin1".equalsIgnoreCase(mysqlEncoding)) {
return "gbk";
}

return (String) MYSQL_TO_JAVA_CHARSET_MAP.get(mysqlEncoding);
}

public final static String getJavaEncodingForMysqlEncoding(String mysqlEncoding,
Connection conn) throws SQLException {

if (conn != null && conn.versionMeetsMinimum(4, 1, 0) &&
"latin1".equalsIgnoreCase(mysqlEncoding)) {
return "gbk";
}

return (String) MYSQL_TO_JAVA_CHARSET_MAP.get(mysqlEncoding);
}


出处:http://blog.csdn.net/workwithwebis3w/article/details/5875314

个人理解:可以将数据库里查出来的数据强转new String(str.getBytes("GBK"),"cp1252");

保存时直接强转: new String(str.getBytes("cp1252"),"GBK");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: