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

Fib*_*ber 6 java jsf jpa character-encoding java-ee

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

当我从数据库中读取数据时,JSF以UTF-8读取和写入我的字符串.但在数据库中字符很糟糕.

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

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

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

current.setUwagiZ("???ó??????ó???? TE");
getFacade().edit(current);
Run Code Online (Sandbox Code Playgroud)

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

我在JDBC Resource中设置了characterEncoding和useUnicode.此外,当NetBeans编码中的某些工具执行命令正常并且MySQL中的数据为UTF-8时,连接似乎很好.

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

Bal*_*usC 8

当信使本身知道传输两侧使用的字符编码时,可能会出现问号.这与Mojibake的区别在于,它不是信使的错,而是生产者和/或消费者的错.

在具有数据库后端的普通Web应用程序中,只有两个地方可以发生这种情况:与数据库通信以及与HTTP客户端的通信.您已经排除了HTTP部分,因此留在了DB部分.

DB部分中的messenger是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
Run Code Online (Sandbox Code Playgroud)

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

也可以看看: