Hibernate + MySQL: Comment définir l'encodage utf-8 pour la base de données et des tables
Que mon système fonctionne sur Linux Mandriva, SGBDR - MySQL 5.
J'ai besoin d'avoir la base de données et les tables 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>
...
mon.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
...
Un peu de 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 quand 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 de UTF-8?
Je vous en serais très reconnaissant!
Merci!!!!
...
Ce qui est étrange, j'ai changé tout à 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 |
- mon.cnf : default-character-set=cp1251 ? changer pour de l'utf-8 !
- Cela a été utile pour moi de savoir quel jeu de caractères et collation j'ai fini avec après diverses valeurs par défaut sont appliquées
SELECT CHARACTER_SET_NAME, COLLATION_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='<database-name>' AND TABLE_NAME='<table-name>' AND COLUMN_NAME='<column-name>';
Vous devez vous connecter pour publier un commentaire.
Vous pouvez également créer des bases de données avec codage.
Utilisez simplement
phpMyAdmin
pour la base de données/création de la table.Il y a quelques paramètres d'URL que vous spécifiez dans l'URL de la veille prolongée réglages de la connexion à l'aide de l'UTF8:
Vous n'avez pas besoin de l'ensemble de l'encodage dans la base de données en utf8
Seulement si vous utilisez
Vous devez définir l'encodage par défaut de MySQL en utf8. Cause de la
hbm2dll
va utiliser le codage par défaut de la base de données.Vous pouvez toujours utiliser
hbm2ddl.auto
, et de modifier la table de la base de données manuellement pour avoir utf8 classement.Si vous n'êtes pas à l'aide de
hbm2ddl.auto
, vous pouvez simplement créer des tableaux avec votre favori de l'encodage.Pas besoin de définir la base de données à un encodage.
Sebastian
J'ai utilisé un dialecte local de classe qui étend la
MySQLDialect
et changé le tableau de type string:J'étais en fait l'extension de la
MySQL5InnoDBDialect
type donc j'étais vraiment à l'aide de:hibernate.connection.CharSet
,hibernate.connection.characterEncoding
ethibernate.connection.useUnicode
propriétés ne semble pas fonctionner sur mon côté (je suis en utilisant le Printemps de Démarrage 1.3.3), mais qui s'étendMySQL5InnoDBDialect
enfin fait le tour.Envisager de changer l'url de connexion de configuration comme ceci:
Il résout le cas.
characterEncoding=utf8
paramètre à laspring.datasource.url=jdbc:mysql://localhost:3306/mydatabase?useUnicode=true&characterEncoding=utf8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
ligne dansapplication.properties
fichier.Je suis en utilisant le Printemps de Données. J'ai essayé en activant les paramètres dans l'URL:
Aussi, j'ai essayé avec hibernate propriétés, mais la solution qui définitivement a fonctionné pour moi est celle proposée par @Gris
Cette ligne a sauvé ma journée:
Tout d'abord sur Java côté, vous devez spécifier l'encodage UTF-8 au lieu de utf-8, reportez-vous à tableau ici.
Deuxième,
characterEncoding
n'est pas un jeu de caractères de vos tables seront créées, c'est juste un jeu de caractères qui sera utilisé lors de la communication et de la lecture/écriture des données vers/à partir de la base de données.MySQL Docs dire que lors de la création des tables, un DB charset sera utilisé si de rien n'était spécifié dans ces domaines. Ce qui signifie que, pour rendre cela possible, votre base de données (pas de Serveur MySQL) doit être créé comme ça:
create database DB_NAME character set utf8;
Ensuite vos tables dans cette base de données doit être créée dans l'encodage utf8. Même histoire avec classement.
Mais bien sûr, vous ne devriez pas compter sur Hibernate hbm2ddl, lire ici pour plus de détails.
Pour ceux qui utilisent le Printemps de Démarrage: ajouter la
characterEncoding=utf8
paramètre à votreapplication.properties
fichier à cette ligne:comment le changement classement de base de données?
Via Spring Java Config de données() cela devrait vous aider:
Être prudent au sujet de ';' à la fin de propriétés de chaîne!