システムは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 |
エンコードを使用してデータベースを作成することもできます。
データベース/テーブルの作成には、単に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&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>
データベースのエンコード全体をutf8に設定する必要はありません
<!-- Database Scheme Auto Update -->
<property name="hbm2ddl.auto">update</property>
MySQLのデフォルトのエンコーディングをutf8に設定する必要があります。原因hbm2dll
はデータベースのデフォルトエンコーディングを使用します。
それでもhbm2ddl.auto
を使用し、データベースのテーブルを手動で変更してutf8照合を使用できます。
hbm2ddl.auto
を使用していない場合は、お好みのエンコードでテーブルを簡単に作成できます。データベースを特別なエンコーディングに設定する必要はありません。
セバスチャン
エンコーディングを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";
}
}
接続URL構成を次のように変更することを検討してください。
<property name="hibernate.connection.url">
jdbc:mysql://localhost/yourdatabase?UseUnicode=true&characterEncoding=utf8
</property>
ケースを解決します。
まず、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&useUnicode=true&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());
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;
}
「;」に注意してくださいプロパティ文字列の最後に!
データベース照合の変更はどうですか?
ALTER DATABASE [データベース] CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Spring Bootを使用する場合:characterEncoding=utf8
パラメータをapplication.properties
ファイルをこの行に:
spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase?useUnicode=true&characterEncoding=utf8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC