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

Ale*_*kov 25 mysql linux hibernate jpa character-encoding

我的系统运行在Linux Mandriva,RDBMS - MySQL 5上.我需要使用UTF-8创建数据库和表.

这是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> 
...
Run Code Online (Sandbox Code Playgroud)

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
...
Run Code Online (Sandbox Code Playgroud)

有些课,例如 -

@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
        ...
Run Code Online (Sandbox Code Playgroud)

但是当生成表时,我看到编码latin1 例如 -

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 |
Run Code Online (Sandbox Code Playgroud)

如何将编码更改为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
    ...
Run Code Online (Sandbox Code Playgroud)

现在 -

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 |
Run Code Online (Sandbox Code Playgroud)

seb*_*ner 58

您还可以使用编码创建数据库.
只需phpMyAdmin用于数据库/表创建.

您可以在hibernate设置的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>
Run Code Online (Sandbox Code Playgroud)

只有在使用时,才需要将数据库中的整个编码设置为utf8

<!-- Database Scheme Auto Update -->
<property name="hbm2ddl.auto">update</property>   
Run Code Online (Sandbox Code Playgroud)

您必须将MySQL的默认编码设置为utf8.因为hbm2dll将使用数据库的默认编码.

您可能仍然使用hbm2ddl.auto,并手动修改数据库的表以进行utf8排序规则.

如果您不使用hbm2ddl.auto,则可以使用您喜欢的编码创建表格.无需将数据库设置为特殊编码.

塞巴斯蒂安


Gra*_*ray 18

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

我使用了一个本地方言类来扩展MySQLDialect和更改表类型字符串:

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

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

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


Duc*_*ran 12

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

<property name="hibernate.connection.url">
    jdbc:mysql://localhost/yourdatabase?UseUnicode=true&amp;characterEncoding=utf8
</property>
Run Code Online (Sandbox Code Playgroud)

它解决了这个问题.


Sta*_*sev 6

首先,在Java方面,您应该指定UTF-8而不是utf8,请参阅此处的表.

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

MySQL Docs说,在创建表时,如果在这些方面没有指定任何内容,将使用DB字符集.这意味着为了实现这一点,您的数据库(不是MySQL服务器)应该像这样创建:

create database DB_NAME character set utf8;

之后,应该使用utf8编码创建此数据库中的表.与整理相同的故事.

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


cam*_*ser 6

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

jdbc:mysql://localhost:3306/DATABASE?createDatabaseIfNotExist=true&amp;useUnicode=true&amp;characterEncoding=utf-8
Run Code Online (Sandbox Code Playgroud)

另外,我尝试过使用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;
}
Run Code Online (Sandbox Code Playgroud)

这条线节省了我的一天:

vendorAdapter.setDatabasePlatform(CustomMysqlDialect.class.getName());
Run Code Online (Sandbox Code Playgroud)