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 |
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&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>
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
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";
}
}
Pensez à changer la configuration de l'URL de connexion comme ceci:
<property name="hibernate.connection.url">
jdbc:mysql://localhost/yourdatabase?UseUnicode=true&characterEncoding=utf8
</property>
Cela résout le cas.
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.
J'utilise Spring-Data. J'ai essayé d'activer les paramètres dans l'URL:
jdbc:mysql://localhost:3306/DATABASE?createDatabaseIfNotExist=true&useUnicode=true&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());
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;
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
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!