27

我的系统在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> 
...

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

如何将编码更改为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
    ...

现在 -

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

9 回答 9

59

您还可以使用编码创建数据库。
只需phpMyAdmin用于创建数据库/表。

您可以在休眠设置的 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&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,您可以简单地使用您喜欢的编码创建表。无需将数据库设置为特殊编码。

塞巴斯蒂安

于 2012-10-25T07:56:12.813 回答
18

如何将编码更改为 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";
    }
}
于 2014-04-15T20:24:43.560 回答
15

考虑像这样更改连接 url 配置:

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

它解决了这个案子。

于 2014-01-18T17:40:09.887 回答
6

首先,在 Java 方面,您应该指定 UTF-8 而不是 utf8,请参阅此处的表格

其次,characterEncoding不是您的表将在其中创建的字符集,这只是一个字符集,将在与数据库进行通信和读取/写入数据时使用。

MySQL Docs说,在创建表的过程中,如果在这些方面没有指定任何内容,将使用 DB 字符集。这意味着为了使这成为可能,您的数据库(不是 MySQL 服务器)应该这样创建:

create database DB_NAME character set utf8;

之后,您在此数据库中的表应以 utf8 编码创建。与整理相同的故事。

但是当然你不应该依赖 Hibernate 的 hbm2ddl,阅读这里了解更多细节。

于 2012-10-25T07:56:56.433 回答
5

我正在使用 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());
于 2016-04-11T11:46:19.340 回答
4

对于那些使用 Spring Boot 的人:将characterEncoding=utf8参数添加到您的application.properties文件到这一行:

spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase?useUnicode=true&characterEncoding=utf8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
于 2019-02-19T05:31:44.443 回答
1

如何更改数据库排序规则?

ALTER DATABASE [数据库] CHARACTER SET utf8 COLLATE utf8_unicode_ci;

于 2016-12-07T07:21:52.763 回答
1

通过 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;
}

小心';' 在属性字符串的末尾!

于 2017-07-14T10:00:53.150 回答
1

您可以使用 Hibernate @Type 属性,根据您的要求,您可以自定义注释并在字段之上应用。像 :

  public class PhoneNumberType implements UserType {
    @Override
    public int[] sqlTypes() {
  return new int[]{Types.INTEGER, Types.INTEGER, Types.INTEGER};
    }

    @Override
    public Class returnedClass() {
        return PhoneNumber.class;
    }

    // other methods
    }   

一、空SafeGet方法:

    @Override
    public Object nullSafeGet(ResultSet rs, String[] names, 
    SharedSessionContractImplementor session, Object owner) throws HibernateException,                   
      SQLException {
    int countryCode = rs.getInt(names[0]);
     if (rs.wasNull())
        return null;
     int cityCode = rs.getInt(names[1]);
    int number = rs.getInt(names[2]);
    PhoneNumber employeeNumber = new PhoneNumber(countryCode, cityCode, number);
     return employeeNumber;
     }

接下来,null SafeSet 方法:

    @Override
     public void nullSafeSet(PreparedStatement st, Object value, 
      int index, SharedSessionContractImplementor session) 
       throws HibernateException, SQLException {
        if (Objects.isNull(value)) {
        st.setNull(index, Types.INTEGER);
        } else {
        PhoneNumber employeeNumber = (PhoneNumber) value;
        st.setInt(index,employeeNumber.getCountryCode());
        st.setInt(index+1,employeeNumber.getCityCode());
        st.setInt(index+2,employeeNumber.getNumber());
      }
     }

最后,我们可以在我们的 OfficeEmployee 实体类中声明我们自定义的 PhoneNumberType:

    @Entity
    @Table(name = "OfficeEmployee")
     public class OfficeEmployee {

      @Columns(columns = { @Column(name = "country_code"), 
      @Column(name = "city_code"), @Column(name = "number") })
      @Type(type = "com.baeldung.hibernate.customtypes.PhoneNumberType")
       private PhoneNumber employeeNumber;

     // other fields and methods
      }

这可能会解决您的问题,这将适用于所有数据库。如果您想了解更多信息,请参考 :: https://www.baeldung.com/hibernate-custom-types 同样您必须执行 UTF-8 编码/解码和 ISO-8859-1 解码/编码

于 2020-01-29T08:06:40.550 回答