6

我在使用JSFEclipseLink JPAMySQL数据库的 Web 应用程序中遇到了大问题。

当我从数据库中读取数据时,JSF 会以 UTF-8 读取和写入我的字符。但在数据库中字符不好。

fe:输入字符:“żźćółzxcv”,写入数据库:“?????zxcv”。但是如果我手动将数据写入数据库,例如:“żźćółzxcv”,那么在 JSF 中读取是完美的。

我从这里尝试了一切:通过 PrimeFaces 输入组件检索的 Unicode 输入已损坏

我发现JSF中的编码很好,但问题出在java中,因为如果我手动设置

current.setUwagiZ("żźćóżźćłąśóżźćł TE");
getFacade().edit(current);

在数据库记录中是错误的:???ó??????ó???? TE

我在 JDBC 资源中设置了 characterEncoding 和 useUnicode。此外,当某些工具在 NetBeans 编码中执行命令是可以的并且 MySQL 中的数据是 UTF-8 时,所以连接似乎很好。

所以问题是java,但我完全不知道如何解决这个问题:(

4

1 回答 1

8

当信使本身知道传输双方使用的字符编码时,可能会出现问号。这就是Mojibake的不同之处,它不是信使的错,而是生产者和/或消费者的错。

在具有数据库后端的普通 Web 应用程序中,只有两个地方会发生这种情况:与 DB 通信和与 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

或者,如果它是特定于容器的数据源配置,则将它们指定为单独的连接属性,与指定用户名和密码的方式完全相同。

也可以看看:

于 2013-02-04T13:36:02.680 回答