【问题标题】:Bad UTF-8 encoding when writing to database (reading is OK)写入数据库时​​出现错误的 UTF-8 编码(读取正常)
【发布时间】:2013-01-19 05:01:08
【问题描述】:

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

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

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 Resource 中设置了 characterEncoding 和 useUnicode。此外,当某些工具在 NetBeans 编码中执行命令是可以的并且 MySQL 中的数据是 UTF-8 时,所以连接似乎很好。

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

【问题讨论】:

  • 你确定你用来浏览数据库的客户端可以处理UTF-8吗?
  • 我是这么认为的,因为问题只是在我想插入或编辑数据时
  • 尝试使用硬编码插入“ĉ\u0109”,它应该给出两倍的c-circumflex。并检查数据库中的表和字段定义。

标签: java jsf jakarta-ee jpa character-encoding


【解决方案1】:

当信使本身知道传输双方使用的字符编码时,可能会出现问号。这就是 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

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

另见:

【讨论】:

  • 我有:jdbc:mysql://localhost:3306/b2b?zeroDateTimeBehavior=convertToNull&useUnicode=yes&characterEncoding=UTF-8 但它不起作用
  • 具体设置在哪里?在例如服务器配置中的数据源这些属性不能进入 URL,它们需要定义为单独的属性(就像用户名和密码一样)。您没有提供有关该部分的太多细节,但您的术语“JDBC 资源”听起来很像 Glassfish 管理控制台中的那个。
  • 我都试过了:在gassfish中我添加了这两个属性,还在persistence.xml中我添加到数据源这个jdbc
  • 啊啊啊啊!我注意到它仍然标记了旧的 JDBC,而没有在 persistence.xml 中设置这两个属性!现在一切正常!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-21
  • 2017-11-08
  • 2011-05-22
  • 2014-07-01
  • 2014-05-05
相关资源
最近更新 更多