Hibernate + MySQL:如何设置数据库和表的编码utf-8

我的系统运行在Linux Mandriva ,RDBMS – MySQL 5上 。 我需要以UTF-8创build数据库和表格。

这里是hibernate.cfg.xml的一个片段 –

... <property name="hibernate.hbm2ddl.auto">create-drop</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.connection.characterEncoding">utf8</property> ... 

my.cnf

 # The MySQL server [mysqld] ... default-character-set=cp1251 character-set-server=cp1251 collation-server=cp1251_general_ci init-connect="SET NAMES cp1251" skip-character-set-client-handshake ... [mysqldump] ... default-character-set=cp1251 ... 

例如,一些课程 –

 @Entity @Table(name = "USER") public class User { @Id @Column(name = "USERID") @GeneratedValue(strategy = GenerationType.AUTO) private Integer id; @Column(name = "USERNAME") private String name; @Column(name = "USERPASSWORD") private String password; @Column(name = "USERIP") private String ip; // getter's and setter's here ... 

但是,当表生成时,我看到编码拉丁例如 –

 SHOW CREATE TABLE USER; USER | CREATE TABLE `user` ( `USERID` int(11) NOT NULL auto_increment, `USERIP` varchar(255) default NULL, `USERNAME` varchar(255) default NULL, `USERPASSWORD` varchar(255) default NULL, PRIMARY KEY (`USERID`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 | 

如何将编码更改为UTF-8

我将非常感激的信息! 谢谢!

这很奇怪,我已经全部改为utf8

 # The MySQL server [mysqld] ... default-character-set=utf8 character-set-server=utf8 collation-server=utf8_general_ci init-connect="SET NAMES utf8" skip-character-set-client-handshake ... [mysqldump] ... default-character-set=utf8 ... 

现在 –

 SHOW CREATE TABLE USER; USER | CREATE TABLE `USER` ( `USERID` int(11) NOT NULL auto_increment, `USERIP` varchar(255) default NULL, `USERNAME` varchar(255) default NULL, `USERPASSWORD` varchar(255) default NULL, PRIMARY KEY (`USERID`) ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 | 

Solutions Collecting From Web of "Hibernate + MySQL:如何设置数据库和表的编码utf-8"

您也可以使用编码创建数据库。 只需使用phpmyadmin来创建数据库/表。

在休眠设置的URL中可以指定一些URL参数,以使用UTF8进行连接:

  <!-- Database Settings --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <!-- for performance reasons changed to MyISAM from org.hibernate.dialect.MySQLInnoDBDialect --> <property name="dialect">org.openmeetings.app.hibernate.utils.MySQL5MyISAMDialect</property> <property name="connection.url">jdbc:mysql://localhost/openmeetings?autoReconnect=true&amp;useUnicode=true&amp;createDatabaseIfNotExist=true&amp;characterEncoding=utf-8</property> <property name="hibernate.connection.CharSet">utf8</property> <property name="hibernate.connection.characterEncoding">utf8</property> <property name="hibernate.connection.useUnicode">true</property> 

您不需要将数据库中的整个编码设置为utf8仅当您正在使用

  <!-- Database Scheme Auto Update --> <property name="hbm2ddl.auto">update</property> 

您将不得不将MySQL的默认编码设置为utf8。 导致hbm2dll将使用数据库的默认编码。

您可能仍然使用hbm2ddl.auto,并手动修改数据库的表以使用utf8归类。

如果你不使用hbm2ddl.auto,你可以简单地用你最喜欢的编码来创建表格。 不需要将数据库设置为特殊编码。

塞巴斯蒂安

如何将编码更改为UTF-8?

我使用了一个扩展了MySQLDialect的本地方言类,并改变了表类型的字符串:

 public class LocalMysqlDialect extends MySQLDialect { @Override public String getTableTypeString() { return " DEFAULT CHARSET=utf8"; } } 

我实际上扩展了MySQL5InnoDBDialect类型,所以我真的在使用:

 public class LocalMysqlDialect extends MySQL5InnoDBDialect { @Override public String getTableTypeString() { return " ENGINE=InnoDB DEFAULT CHARSET=utf8"; } } 

考虑改变连接的URL配置,如下所示:

 <property name="hibernate.connection.url"> jdbc:mysql://localhost/yourdatabase?UseUnicode=true&amp;characterEncoding=utf8 </property> 

它解决了这个问题。

我正在使用Spring-Data。 我试过在URL中激活参数:

 jdbc:mysql://localhost:3306/DATABASE?createDatabaseIfNotExist=true&amp;useUnicode=true&amp;characterEncoding=utf-8 

另外,我已经尝试过使用hibernate属性,但是最终为我工作的解决方案是由@Gray提出的解决方案

 @Bean @Autowired public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) { HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); vendorAdapter.setGenerateDdl(dbGenerateDdl); vendorAdapter.setShowSql(dbShowSql); if (Arrays.asList(environment.getActiveProfiles()).contains("prod")) vendorAdapter.setDatabasePlatform(CustomMysqlDialect.class.getName()); Properties jpaProperties = new Properties(); jpaProperties.put("hibernate.connection.CharSet", "utf-8"); jpaProperties.put("hibernate.connection.useUnicode", true); jpaProperties.put("hibernate.connection.characterEncoding", "utf-8"); LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); factory.setJpaVendorAdapter(vendorAdapter); factory.setPackagesToScan("com.example.model"); factory.setDataSource(dataSource); factory.setJpaProperties(jpaProperties); return factory; } 

这条线节省了我的一天:

 vendorAdapter.setDatabasePlatform(CustomMysqlDialect.class.getName()); 

首先在Java方面你应该指定UTF-8而不是utf8,请参考表格 。

其次, characterEncoding不是你的表将被创建的字符集,这只是一个字符集,将用于通信和读/写数据到/从数据库。

MySQL文档说,在创建表的过程中,如果没有在这些方面指定任何内容,则会使用一个数据库字符集。 这意味着为了使这成为可能,你的数据库(不是MySQL服务器)应该像这样创建:

create database DB_NAME character set utf8;

之后,这个数据库中的表格应该用utf8编码创建。 与整理相同的故事。

但是,当然你不应该依赖Hibernate的hbm2ddl, 在这里阅读更多细节。

如何改变数据库整理?

ALTER DATABASE [database] CHARACTER SET utf8 COLLATE utf8_unicode_ci;

通过Spring的Java配置dataSource()这应该有所帮助:

 @Bean public DataSource dataSource() { BasicDataSource dataSource = new BasicDataSource(); //your username/pass props dataSource.setConnectionProperties("useUnicode=true;characterEncoding=utf8;characterSetResults=UTF-8;"); return dataSource; } 

小心';' 在属性字符串的末尾!