【问题标题】:How to correctly insert utf-8 characters into a MySQL table using jpa如何使用 jpa 将 utf-8 字符正确插入 MySQL 表
【发布时间】:2014-01-08 02:30:28
【问题描述】:

我想通过我的 Web 应用程序在 MySQL 数据库中插入信息。我在 TomEE 服务器上通过 OpenJPA 完成 例如:

public void addLecturer(String name, String surname) {
    Lecturer lect = new Lecturer(name,surname);

    em.persist(lect);
}

其中 Lecturer 是实体类。问题是应用程序以 latin1 编码插入数据。我想以 UTF-8 编码插入它。

当我在命令行终端中通过简单的 MySQL 命令插入数据时,我会以 UTF-8 编码获取信息。

我看过这个,我看到 character_set_server 设置为 latin1 但我不知道这是不是问题或如何更改它:

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

编辑

我也有同样的问题:

JPA utf-8 characters not persisted

UTF - 8 with JPA and Glassfish 4.0

我将useUnicode=yescharacterEncoding=utf8characterSetResults=utf8 添加到我的财产javax.persistence.jdbc.url,但这没有帮助。

【问题讨论】:

    标签: mysql jpa encoding persistence


    【解决方案1】:

    您的应用程序是 Web 应用程序???如果是这样,请检查您的应用程序服务器是否配置为处理 UTF-8 请求。例如,在 tomcat 中,可以在连接器部分的 server.xml 中完成。

    【讨论】:

    • 我使用 Tomcat (TomEE),在 server.xml 中我只有 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/><Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>
    • 所以你必须像这样添加 URIEncoding 属性:[code][code ]
    • 它没有帮助,我添加了 URIEncoding 属性,但我得到了 latin1 中的信息(我就是这样):(
    【解决方案2】:

    我认为这与您的应用程序、容器等无关。当然,除非您的示例中的 namesurname 的值已经错误(我不假设)。因此,确实可能是由于编码设置。你查看this post提供的信息了吗?

    【讨论】:

    • 我检查过了,但我无权访问 my.cfn 文件。我只想为我的数据库更改编码。很奇怪,我可以通过控制台或mysql工作台输入国家字符,一切正常,但我的应用程序不能这样做
    • 此外,我会在persist() 操作之前检查namesurname 中实际存在的内容。从您的前端到传递给addLecturer() 的值可能仍然是一个绑定问题。
    • 我有同样的问题,我尝试添加useUnicode=yes&characterEncoding=UTF-8,但它没有帮助。我调试我的应用程序并检查 persist() namesurname 之前是否有带有 utf-8 字符的字符串
    【解决方案3】:

    好的,我找到解决办法:

    我通过 JTA 获取数据,因此我从 tomee.xml 中定义的数据源获取 persistence.xml 的数据:

    <?xml version="1.0" encoding="UTF-8"?>
    <tomee>
      <Resource id="database" type="DataSource">
        JdbcDriver com.mysql.jdbc.Driver
        JdbcUrl jdbc:mysql://localhost:11080/db?zeroDateTimeBehavior=convertToNull&amp;characterEncoding=utf8&amp;characterSetResults=utf8
        UserName my
        Password pass
      </Resource>
    </tomee>
    

    所以我必须在tomee.xml 文件中将&amp;characterEncoding=utf8&amp;characterSetResults=utf8 添加到JdbcUrl 参数(请注意,对于有效的xml,我必须使用&amp;amp; 而不是&amp;)。我不必将此信息添加到 persistence.xml(仅因为我使用 JTA)。

    现在一切正常。感谢 arievanwi 指导我解决问题。

    【讨论】:

      【解决方案4】:

      2 个步骤

      将查询字符串附加到 jdbc url

      ?characterEncoding=utf-8    
      

      对表运行以下sql命令

      ALTER TABLE <tablename> CONVERT TO CHARACTER SET utf8 COLLATE
      utf8_unicode_ci;
      

      【讨论】:

        【解决方案5】:

        为了正确实现 unicode 并支持多种不同的语言,您需要 2 个配置:

        1. Mysql 表或数据库架构应该支持 utf8

          • 创建数据库时使用如下:

          CREATE SCHEMA mytestdb DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ;

          • 或将表更改为:

          ALTER TABLE myTableName CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

        2. 现在您需要正确的 JDBC url 并指定 utf-8 字符集,请记住转义任何特殊字符,如下所示: spring.datasource.url=jdbc\:mysql\://localhost\:3306/${SERVER_DB_NAME}\?useUnicode=true\&amp;characterEncoding=utf\-8\&amp;characterSetResults=utf\-8

        这就是我实现它并为我工作的方式。

        【讨论】:

          猜你喜欢
          • 2013-01-26
          • 2012-08-09
          • 2013-05-05
          • 2017-05-14
          • 2014-04-02
          • 1970-01-01
          • 2011-07-21
          • 1970-01-01
          相关资源
          最近更新 更多