如何使用jpa将utf-8字符正确插入MySQL表

时间:2013-12-19 13:32:01

标签: mysql jpa encoding persistence

我想通过我的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,但它没有帮助。

5 个答案:

答案 0 :(得分:7)

好的,我找到了决心:

我通过JTA获取数据,因此我从persistence.xml中定义的数据源获取tomee.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>

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

现在一切都很好。感谢 arievanwi 让我直接解决问题。

答案 1 :(得分:6)

2个步骤

将查询字符串附加到jdbc url

?characterEncoding=utf-8    

在表

上运行以下sql命令
ALTER TABLE <tablename> CONVERT TO CHARACTER SET utf8 COLLATE
utf8_unicode_ci;

答案 2 :(得分:2)

我不认为这与你的应用程序,容器等有任何关系,除非你的例子中namesurname的值已经错了(我不知道)假设)。因此,确实可能是由于编码设置。您是否检查了this post中提供的信息?

答案 3 :(得分:0)

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

答案 4 :(得分:0)

为了正确实现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\&characterEncoding=utf\-8\&characterSetResults=utf\-8

  3. 这就是我实施它并为我工作的方式。