gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:06:32 25 4
gpt4 key购买 nike

我在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com