【问题标题】:MySQL tables are not UTF-8 even though I instructed Hibernate to do create them with UTF-8MySQL 表不是 UTF-8,即使我指示 Hibernate 使用 UTF-8 创建它们
【发布时间】:2015-07-15 16:11:06
【问题描述】:

我正在使用 Spring Boot 应用程序,尽管我指示 Hibernate 在 UTF-8 中创建新表,但所有新表都在 latin1 中。

spring.jpa.properties.hibernate.connection.characterEncoding=utf-8
spring.jpa.properties.hibernate.connection.CharSet=utf-8
spring.jpa.properties.hibernate.connection.useUnicode=true

我正在使用 Hikari。

【问题讨论】:

  • 我认为您必须在数据库级别进行此设置
  • 我正在调查。但是找不到明确的答案

标签: mysql hibernate utf-8 spring-boot


【解决方案1】:

我的数据库有 latin1 编码:

SELECT @@character_set_database, @@collation_database;

先修复数据库:

foreach table: ALTER TABLE @table CONVERT TO CHARACTER SET utf8;
ALTER DATABASE javabg CHARACTER SET utf8 COLLATE utf8_unicode_ci;

确保所有连接都使用 utf8 - 编辑 my.cnf:

[mysqld]
#mist: set default encoding to utf-8
init-connect='SET NAMES utf8'
character-set-server = utf8
collation-server = utf8_general_ci

【讨论】:

  • 没有。不要这样做CONVERT TO,除非您确定您遇到的问题是解决方案。否则,您可能会使问题变得更糟。
  • 我修复了它们,你的意思是更糟?如果我从 utf8 到 latin1,可能是的,但是从 latin1 到 utf8?
  • 如果您将 utf8 盲目地塞进 latin1(没有正确转换),那么 CONVERT TO 将进行第二次转换,从而更难恢复“正确”文本。请参阅my blog 中的“案例 1”。
  • 我认为您无法将 ????? 还原为实际字符串。我使用了另一个答案中的 mysql HEX 函数,它产生了3F3F3F3F。也许在转换之前可能有机会,但我认为insert 上的数据丢失了。现在,之后,转换 - 没有机会。
【解决方案2】:

注意:当您以root 连接时,init-connect 将被忽略。

ALTER TABLE @table CONVERT TO CHARACTER SET utf8; 仅当您现在在表中具有正确的 latin1 数据编码时才适用。如果您在 latin1 字段中放置了非西欧文本,则解决方案是其他的。请做

SELECT col, HEX(col) ...

现在看看里面有什么。

如果要在网页上输出,则需要检查元标记是否指定 utf8。

【讨论】:

    猜你喜欢
    • 2018-12-31
    • 1970-01-01
    • 2014-12-11
    • 2017-01-12
    • 1970-01-01
    • 2013-07-04
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多