MySQL使用Latin1编码 - 如何插入UTF-8编码的数据?

3
我有一个基于JSF2.0的Web应用程序,运行在Tomcat 6和MySQL上。我使用特殊字符,例如“ąśżźć”。我能够从MySQL中读取数据并在网页上正确显示它们。但是当用户填写表单时,如果使用任何特殊字符,则在MySQL中这些字符会被替换为“?”。但是,如果我使用MySQL Workbench工具进行插入到数据库中,一切正常,并且特殊字符在网页上正确显示。
我的配置:
JSF - UTF-8 (for response and request character encoding)
MySQL columns are configured to use UTF-8, example: DESCRIPTION varchar(100)  CHARACTER SET utf8 null
character_set_client    utf8
character_set_connection    utf8
character_set_database  latin1
character_set_filesystem    binary
character_set_results   utf8
character_set_server    latin1
character_set_system    utf8

字符集设置为latin1会给我带来很大的问题。当使用UTF-8时一切正常,但是在latin1下不行。

我的托管公司不会更改MySQL设置,所以只能保留latin1 :-(。

我该如何解决这个问题?

我已经尝试了很多解决方案,比如创建过滤器、使用Charset和String.getBytes()进行转换。我已经想不到更好的办法了。

我正在使用org.apache.tomcat.jdbc.pool.DataSource进行连接。


1
JDBC的URL/配置是什么?是否有"useUnicode"和"characterEncoding"参数?能否对其进行控制? - BalusC
谢谢你的快速和良好的回应。在你的回答后,我开始处理URL。现在我已经创建了MySQL的URL: String url ="jdbc:mysql://" + serverName + ":3306/" + databaseName + "?CharSet=utf8&useUnicode=true&characterEncoding=utf8";第一次运行看起来似乎是可以工作的!请再给我24个小时进行测试。明天我会写反馈。非常感谢! - hopeman
1个回答

8

MySQL JDBC驱动默认使用平台默认的字符编码,该编码由Charset#getDefaultCharset()获取,但不一定是UTF-8。您需要在JDBC URL中设置它作为参数:

jdbc:mysql://localhost:3306/dbname?useUnicode=true&characterEncoding=UTF-8

另请参阅:


1
你的解决方案正常工作。非常感谢BalusC。我有一点不同意:JDBC驱动程序默认不会使用jvm字符集连接Charset#getDefaultCharset()。 在我的服务器上,该函数返回UTF-8,但仍然存在问题。 最后URL解决了这个问题。 - hopeman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接