webentwicklung-frage-antwort-db.com.de

Hibernate + MySQL: Festlegen der Kodierung utf-8 für Datenbank und Tabellen

Mein System läuft unter Linux Mandriva , RDBMS - MySQL 5 . Ich muss die Datenbank und die Tabellen in UTF-8 erstellen.

Hier ist ein Fragment von 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
...

Eine Klasse zum Beispiel -

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

Wenn die Tabellen generiert werden, sehe ich die Kodierung latin1 Zum Beispiel: 

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 |

Wie kann ich die Kodierung in UTF-8 ändern?

Ich wäre sehr dankbar für die Informationen! Vielen Dank!

...

Das ist seltsam, ich habe alles auf utf8 - geändert.

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

Und nun -

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

Sie können auch Datenbanken mit Verschlüsselung erstellen.
Verwenden Sie einfach phpMyAdmin für die Datenbank-/Tabellenerstellung.

Es gibt einige URL-Parameter, die Sie in der URL der Hibernate-Einstellungen angeben würden, um die Verbindung mit UTF8 herzustellen:

<!-- 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>

Sie müssen nicht die gesamte Codierung in der Datenbank auf utf8 Setzen. Nur wenn Sie verwenden 

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

Sie müssen die Standardcodierung von MySQL auf utf8 setzen. Der hbm2dll verwendet die Standardcodierung der Datenbank.

Sie können weiterhin hbm2ddl.auto verwenden und die Tabelle der Datenbank manuell ändern, um eine utf8-Sortierung zu erhalten.

Wenn Sie hbm2ddl.auto nicht verwenden, können Sie die Tabellen einfach mit Ihrer bevorzugten Kodierung erstellen Die Datenbank muss nicht auf eine spezielle Kodierung festgelegt werden.

Sebastian

55
seba.wagner

Wie kann ich die Kodierung in UTF-8 ändern?

Ich habe eine lokale Dialektklasse verwendet, die MySQLDialect erweitert und die Zeichenfolge vom Tabellentyp geändert hat:

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

Ich habe tatsächlich den MySQL5InnoDBDialect-Typ erweitert, also habe ich wirklich verwendet:

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

Ändern Sie die Konfiguration der Verbindungs-URL folgendermaßen:

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

Es löst den Fall.

11
Duc Tran

Auf Java-Seite sollten Sie vor allem UTF-8 anstelle von utf8 angeben, siehe table here .

Zweitens ist characterEncoding kein Zeichensatz, in dem Ihre Tabellen erstellt werden. Dies ist nur ein Zeichensatz, der während der Kommunikation und beim Lesen/Schreiben von Daten in/aus der Datenbank verwendet wird.

MySQL Docs sagen, dass während der Erstellung von Tabellen ein DB-Zeichensatz verwendet wird, wenn diesbezüglich nichts angegeben wurde. Um dies zu ermöglichen, sollte Ihre Datenbank (nicht MySQL Server) folgendermaßen erstellt werden:

create database DB_NAME character set utf8;

Anschließend sollten Ihre Tabellen in dieser Datenbank in utf8-Codierung erstellt werden. Gleiche Geschichte mit Sortierung.

Natürlich sollten Sie sich nicht auf Hibernates hbm2ddl verlassen, lesen Sie hier für weitere Details.

Ich verwende Spring-Data. Ich habe versucht, Parameter in der URL zu aktivieren:

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

Ich habe es auch mit Eigenschaften für den Winterschlaf versucht, aber die Lösung, die definitiv für mich funktioniert hat, ist die von @Gray vorgeschlagene

@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;
}

Diese Zeile hat meinen Tag gerettet:

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

wie wäre es mit einer Datenbanksortierung?

ALTER DATABASE [Datenbank] CHARACTER SET utf8 COLLATE utf8_unicode_ci;

2
jo8937

Für diejenigen, die Spring Boot verwenden: Fügen Sie der characterEncoding=utf8-Datei den application.properties-Parameter zu dieser Zeile hinzu:

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

Über Spring Java Config dataSource () sollte dies helfen:

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

Seien Sie vorsichtig mit ';' am Ende der Eigenschaftszeichenfolge!

1
Dmitry Skirdin