我在使用 JSF 和 EclipseLink JPA 到 MySQL 数据库的 Web 应用程序中遇到了很大的问题。
当我从数据库读取数据时,JSF 以 UTF-8 OK 读取和写入我的字符。但在数据库中字符是坏的。
f.e.: 输入字符:“żźćółzxcv”,写入数据库:“??????zxcv”。 但是,如果我手动将数据写入数据库,例如:“żźćółzxcv”,那么在 JSF 中读取是完美的。
我从这里尝试了一切:Unicode input retrieved via PrimeFaces input components become corrupted
然后我发现用JSF编码没问题,但问题出在java,因为如果我手动设置
current.setUwagiZ("żźćóżźćłąśóżźćł TE");
getFacade().edit(current);
数据库记录错误:???ó????????ó???? TE
我在 JDBC 资源中设置了 characterEncoding 和 useUnicode。此外,当通过某些工具在 NetBeans 中执行命令时,编码是可以的,而 MySQL 中的数据是 UTF-8,因此连接似乎很好。
所以问题是java,但我完全不知道如何解决:(
最佳答案
当信使本身知道传输双方使用的字符编码时,可能会出现问号。这就是 Mojibake 的区别这不是信使的错,而是生产者和/或消费者的错。
在具有数据库后端的普通 Web 应用程序中,只有 2 个地方可能发生这种情况:与数据库的通信和与 HTTP 客户端的通信。您已经排除了 HTTP 部分,因此留下了 DB 部分。
DB部分的信使是JDBC驱动。您需要告诉 JDBC 驱动程序使用 UTF-8。众所周知,MySQL JDBC 驱动程序默认使用客户端平台默认编码,在您的特定情况下显然不是 UTF-8。
将以下 2 个属性添加到 JDBC 连接:
useUnicode=true
characterEncoding=UTF-8
目前还不清楚您是如何配置 JDBC 连接的,但是如果它是“普通”JDBC,那么请将它们指定为 JDBC URL 中的查询字符串:
jdbc:mysql://localhost:3306/db_name?useUnicode=true&characterEncoding=UTF-8
或者,如果它是特定于容器的数据源配置,则将它们指定为单独的连接属性,与指定用户名和密码的方式完全相同。
另见:
关于java - 写入数据库时错误的 UTF-8 编码(读取正常),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14687698/