web-dev-qa-db-fra.com

Hibernate + MySQL: Comment définir l'encodage utf-8 pour la base de données et les tables

Mon système tourne sous Linux Mandriva , SGBDR - MySQL 5 . Il faut que la base de données et les tables soient créées dans UTF-8 .

Voici un fragment de 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
...

Une classe, par exemple -

@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
        ...

Mais lorsque les tables sont générées, je vois l'encodage latin1 Par exemple- 

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 |

Comment changer l'encodage en UTF-8 ?

Je vous serais très reconnaissant de l’information! Merci!

...

C'est étrange, j'ai tout changé en 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
    ...

Et maintenant -

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 |
24
Aleksey Bykov

Vous pouvez également créer des bases de données avec codage.
Utilisez simplement phpMyAdmin pour la création de la base de données/table.

Vous devez spécifier certains paramètres d'URL dans l'URL des paramètres de veille prolongée pour établir la connexion à l'aide de 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>

Il n'est pas nécessaire de définir le codage complet de la base de données sur utf8 Seulement si vous utilisez 

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

Vous devrez définir le codage par défaut de MySQL sur utf8. Parce que le hbm2dll utilisera le codage par défaut de la base de données.

Vous pouvez toujours utiliser hbm2ddl.auto et modifier manuellement la table de la base de données pour obtenir un classement utf8.

Si vous n'utilisez pas hbm2ddl.auto, vous pouvez simplement créer les tables avec votre encodage favori . Inutile de définir la base de données sur un encodage spécial.

Sebastian

55
seba.wagner

Comment changer l'encodage en UTF-8?

J'ai utilisé une classe de dialecte local qui a étendu MySQLDialect et modifié la chaîne de type table:

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

J'étais en train d'étendre le type MySQL5InnoDBDialect donc j'utilisais vraiment:

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

Pensez à changer la configuration de l'URL de connexion comme ceci:

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

Cela résout le cas.

11
Duc Tran

Tout d’abord, côté Java, vous devez spécifier UTF-8 au lieu de utf8, reportez-vous au tableau ici .

Deuxièmement, characterEncoding n'est pas un jeu de caractères dans lequel vos tables seront créées, il s'agit simplement d'un jeu de caractères qui sera utilisé pendant la communication et la lecture/écriture de données dans/à partir de la base de données.

Les documents MySQL indiquent que, lors de la création des tables, un jeu de caractères DB sera utilisé si rien n’a été spécifié à cet égard. Ce qui signifie que pour rendre cela possible, votre base de données (et non pas le serveur MySQL) devrait être créée comme ça:

create database DB_NAME character set utf8;

Ensuite, vos tables dans cette base de données doivent être créées avec le codage utf8. Même histoire avec collation.

Mais bien sûr, vous ne devriez pas vous fier à hbm2ddl, lisez ici pour plus de détails.

6

J'utilise Spring-Data. J'ai essayé d'activer les paramètres dans l'URL:

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

Aussi, j'ai essayé avec des propriétés d'hibernation, mais la solution qui a fonctionné pour moi est celle proposée par @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;
}

Cette ligne a sauvé ma journée:

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

que diriez-vous de modifier le classement de la base de données?

ALTER DATABASE [base de données] CHARACTER SET utf8 COLLATE utf8_unicode_ci;

2
jo8937

Pour ceux qui utilisent Spring Boot: ajoutez le paramètre characterEncoding=utf8 à votre fichier application.properties à cette ligne:

spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase?useUnicode=true&characterEncoding=utf8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
1
Yamashiro Rion

Avec Spring Java Config dataSource (), cela devrait aider:

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

Faites attention à ';' à la fin de la chaîne de propriétés!

1
Dmitry Skirdin