Ale*_*kov 25 mysql linux hibernate jpa character-encoding
我的系统运行在Linux Mandriva,RDBMS - MySQL 5上.我需要使用UTF-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>
...
Run Code Online (Sandbox Code Playgroud)
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
...
Run Code Online (Sandbox Code Playgroud)
有些课,例如 -
@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
...
Run Code Online (Sandbox Code Playgroud)
但是当生成表时,我看到编码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 |
Run Code Online (Sandbox Code Playgroud)
如何将编码更改为UTF-8?
我将非常感谢这些信息!谢谢!
...
这很奇怪,我把所有内容改为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
...
Run Code Online (Sandbox Code Playgroud)
现在 -
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 |
Run Code Online (Sandbox Code Playgroud)
seb*_*ner 58
您还可以使用编码创建数据库.
只需phpMyAdmin用于数据库/表创建.
您可以在hibernate设置的URL中指定一些URL参数,以使用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>
Run Code Online (Sandbox Code Playgroud)
只有在使用时,才需要将数据库中的整个编码设置为utf8
<!-- Database Scheme Auto Update -->
<property name="hbm2ddl.auto">update</property>
Run Code Online (Sandbox Code Playgroud)
您必须将MySQL的默认编码设置为utf8.因为hbm2dll将使用数据库的默认编码.
您可能仍然使用hbm2ddl.auto,并手动修改数据库的表以进行utf8排序规则.
如果您不使用hbm2ddl.auto,则可以使用您喜欢的编码创建表格.无需将数据库设置为特殊编码.
塞巴斯蒂安
Gra*_*ray 18
如何将编码更改为UTF-8?
我使用了一个本地方言类来扩展MySQLDialect和更改表类型字符串:
public class LocalMysqlDialect extends MySQLDialect {
@Override
public String getTableTypeString() {
return " DEFAULT CHARSET=utf8";
}
}
Run Code Online (Sandbox Code Playgroud)
我实际上扩展了MySQL5InnoDBDialect类型,所以我真正使用:
public class LocalMysqlDialect extends MySQL5InnoDBDialect {
@Override
public String getTableTypeString() {
return " ENGINE=InnoDB DEFAULT CHARSET=utf8";
}
}
Run Code Online (Sandbox Code Playgroud)
Duc*_*ran 12
考虑更改连接URL配置,如下所示:
<property name="hibernate.connection.url">
jdbc:mysql://localhost/yourdatabase?UseUnicode=true&characterEncoding=utf8
</property>
Run Code Online (Sandbox Code Playgroud)
它解决了这个问题.
首先,在Java方面,您应该指定UTF-8而不是utf8,请参阅此处的表.
其次,characterEncoding不是一个字符集,你的表将被创建,这只是一个字符集,将用于通信和读/写数据到数据库.
MySQL Docs说,在创建表时,如果在这些方面没有指定任何内容,将使用DB字符集.这意味着为了实现这一点,您的数据库(不是MySQL服务器)应该像这样创建:
create database DB_NAME character set utf8;
之后,应该使用utf8编码创建此数据库中的表.与整理相同的故事.
但是当然你不应该依赖Hibernate的hbm2ddl,在这里阅读更多细节.
我正在使用Spring-Data.我试过激活URL中的参数:
jdbc:mysql://localhost:3306/DATABASE?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf-8
Run Code Online (Sandbox Code Playgroud)
另外,我尝试过使用hibernate属性,但对我来说最终有效的解决方案是@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;
}
Run Code Online (Sandbox Code Playgroud)
这条线节省了我的一天:
vendorAdapter.setDatabasePlatform(CustomMysqlDialect.class.getName());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
67027 次 |
| 最近记录: |