web-dev-qa-db-ja.com

Hibernate + MySQL:データベースとテーブルのエンコーディングutf-8を設定する方法

システムはLinux Mandriva、RDBMS-MySQL 5で実行されます。 TF-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> 
...

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

いくつかのクラス、たとえば-

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

しかし、テーブルが生成されると、エンコーディングが表示されます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 |

エンコーディングをTF-8に変更する方法は?

情報に最も感謝します!ありがとうございました!

...

これは奇妙です。すべてをtf8-に変更しました

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

そしていま -

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

エンコードを使用してデータベースを作成することもできます。
データベース/テーブルの作成には、単にphpMyAdminを使用します。

UTF8を使用して接続するために、休止状態設定のURLで指定するURLパラメーターがいくつかあります。

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

データベースのエンコード全体をutf8に設定する必要はありません

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

MySQLのデフォルトのエンコーディングをutf8に設定する必要があります。原因hbm2dllはデータベースのデフォルトエンコーディングを使用します。

それでもhbm2ddl.autoを使用し、データベースのテーブルを手動で変更してutf8照合を使用できます。

hbm2ddl.autoを使用していない場合は、お好みのエンコードでテーブルを簡単に作成できます。データベースを特別なエンコーディングに設定する必要はありません。

セバスチャン

57
seba.wagner

エンコーディングをUTF-8に変更する方法は?

MySQLDialectを拡張し、テーブルタイプの文字列を変更したローカル方言クラスを使用しました。

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

私は実際にMySQL5InnoDBDialectタイプなので、実際に使用していました。

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

接続URL構成を次のように変更することを検討してください。

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

ケースを解決します。

11
Duc Tran

まず、Java側でutf8ではなくUTF-8を指定する必要があります。 table here を参照してください。

第二に、characterEncodingはテーブルが作成される文字セットではありません。これはデータベースとの通信およびデータの読み取り/書き込み中に使用される単なる文字セットです。

MySQL Docs テーブルの作成中に、これらの点で何も指定されていない場合、DB文字セットが使用されると言います。つまり、これを可能にするには、データベース(MySQLサーバーではなく)を次のように作成する必要があります。

create database DB_NAME character set utf8;

その後、このデータベース内のテーブルをutf8エンコードで作成する必要があります。照合と同じ話。

しかし、もちろんHibernateのhbm2ddlに依存するべきではありません。詳細については here を読んでください。

私はSpring-Dataを使用しています。 URLのパラメーターをアクティブにしようとしました。

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

また、私は休止状態のプロパティで試しましたが、私のために決定的に働いた解決策は@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;
}

この行は私の一日を救った:

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

Spring Java config dataSource()を使用すると、これが役立ちます:

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

「;」に注意してくださいプロパティ文字列の最後に!

2
Dmitry Skirdin

データベース照合の変更はどうですか?

ALTER DATABASE [データベース] CHARACTER SET utf8 COLLATE utf8_unicode_ci;

2
jo8937

Spring Bootを使用する場合:characterEncoding=utf8パラメータをapplication.propertiesファイルをこの行に:

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