我的系统运行在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 |
您也可以使用编码创建数据库。 只需使用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&useUnicode=true&createDatabaseIfNotExist=true&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&characterEncoding=utf8 </property>
它解决了这个问题。
我正在使用Spring-Data。 我试过在URL中激活参数:
jdbc:mysql://localhost:3306/DATABASE?createDatabaseIfNotExist=true&useUnicode=true&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; }
小心';' 在属性字符串的末尾!