java - 写入数据库时​​错误的 UTF-8 编码(读取正常)

标签 java jsf jakarta-ee jpa character-encoding

我在使用 JSFEclipseLink JPAMySQL 数据库的 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/

相关文章:

java - 部署的 EAR 中的配置文件修改

java - 如何下载 PrimeFaces showcase?

java - 服务器压缩有效负载时出现 websocket 协议(protocol)错误

java - Hadoop可以与Eclipse(java)以外的其他产品一起工作吗?

java - 显示/隐藏 h :inputText on selection of h:selectOneMenu

java - JSF 中的 'binding' 如何工作?

java - 如何限制JtextField在数据库中放置额外的空格?

java - 连接java和sql。错误

java - 如何限制未登录用户访问某些页面? (JSF 2.0)

java - 无状态 session bean 在缺少 EntityManager 的上下文中调用