JDBC字符编码

26

我的Java Web应用程序运行在GlassFish 3上,并使用JPA(EclipseLink)连接MySQL数据库。我遇到的问题是,如果我使用update()方法将实体保存到数据库中,String字段会失去完整性;一些字符会显示为'?'

服务器、页面和数据库都配置为使用UTF-8编码。

当我提交表单数据后,下一页正确显示数据。此外,在NetBeans调试中,“似乎”当前实体的String属性存储了正确的值。我不知道NetBeans调试是否可信;可能它能正确解码,但实际上是不正确的。


3
数据库是什么,你使用的是什么连接字符串? - Pascal Thivent
我正在使用MySQL,连接字符串是:jdbc:mysql://localhost:3306/administer - Daniel Szalay
1
一个链接供那些想要使用utf8mb4的人使用:http://dev.mysql.com/doc/connector-j/en/connector-j-reference-charsets.html - Daniel Szalay
5个回答

53

决定编码的是JDBC,而不是JPA:

jdbc:mysql://localhost:3306/administer?characterEncoding=utf8

5
对于那些遇到同样问题的人,这里有一个小提示:如果你想在 persistence.xml 中在 JDBC URL 中连接多个参数,你需要将 & 重写为 &。例如:jdbc:mysql://localhost:3306/administer?rewriteBatchedStatements=true&characterEncoding=UTF-8。请注意,这不会改变原意,只是使内容更加通俗易懂。 - Daniel Szalay
对于较新版本的 jdbc 驱动程序(>= 5.1.13),不需要指定 "characterEncoding"。请查看:https://dev59.com/kWMl5IYBdhLWcg3w3aLj#18059663 - Nitin Bansal

12
我用以下方法解决了这个问题:我使用GlassFish管理界面将这个属性添加到我的连接池设置中:

characterEncoding = UTF-8


5

新版本的JDBC驱动程序可以自动检测字符编码,您无需明确设置它。


0

我还必须添加useUnicode=true,因此我必须使用“&”连接参数,使其看起来像这样:

jdbc:mysql://127.0.0.1:3306/warranteer?useUnicode=true&characterEncoding=UTF-8

如果您像我一样使用Maven配置文件来设置MySQL的URL,请确保将&替换为&,因为Maven在将persistence.xml文件写入classes文件夹时会对URL进行反转义。

0

我遇到了一个类似的问题,其中一个特殊字符在测试环境中被翻译成了?,但在生产环境中却可以正常工作。 以下是MySQL版本详细信息:

Prod: 5.5.62
Staging: 5.7.25

我检查了排序规则和字符集,发现它们之间存在差异,并最终将所有的排序规则和字符集值都调整为与暂存区相同。为了参考,我使用了以下命令进行比较和更新:

SHOW CREATE TABLE dbname.tablename;
select*from information_schema.schemata;
ALTER DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;    
ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE tablename CHARACTER SET utf8, COLLATE utf8_general_ci;

两个环境中的jdk版本不匹配,但是日志能够读取特殊字符,因此我们确定问题可能出在hibernate刷新或MySQL上。但是在同步MySQL后,它被排除在可能的根本原因之外。所以我们将jdbc-url参数更改为characterEncoding=utf8,然后它就可以工作了。


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