Java 双编码UTF-8字符串-MySql,Hibernate

Java 双编码UTF-8字符串-MySql,Hibernate,java,mysql,hibernate,character-encoding,dropwizard,Java,Mysql,Hibernate,Character Encoding,Dropwizard,在使用hibernate使用Base64编码后,我们将在MySQL数据库中保存一个字符串 以下是执行此操作的代码: @Basic @Column(name = "name", nullable = false) @ColumnTransformer(read = "FROM_BASE64(name) ", write ="TO_BASE64(?)") public String getName() 现在,当我保存rotebühlstr时,它被保存在DB中,作为c

在使用hibernate使用Base64编码后,我们将在MySQL数据库中保存一个字符串

以下是执行此操作的代码:

    @Basic
    @Column(name = "name", nullable = false)
    @ColumnTransformer(read = "FROM_BASE64(name) ", write ="TO_BASE64(?)")
    public String getName()
现在,当我保存rotebühlstr时,它被保存在DB中,作为cm90ZWLDvGhsc3Ry。当我在终端上打印时,它显示为rotebühlstr,其中应为rotebühlstr

这是一个dropwizard项目,mysql连接的config.yaml如下所示:

      properties:
      charSet: UTF-8
      characterEncoding: UTF-8
      useUnicode: true
      hibernate.dialect: org.hibernate.dialect.MySQL5InnoDBDialect
      hibernate.jdbc.batch_size: 100
      hibernate.envers.audit_table_suffix: "_aud"
      hibernate.id.new_generator_mappings: false
MySQL列描述:
name
varchar(200)字符集utf8mb4 COLLATE utf8mb4\u unicode\u ci NOT NULL

    mysql> show variables like 'character_set_%';
    +--------------------------+--------------------------------------- 
    --------------------+
    | Variable_name            | Value                                                     
    |
    +--------------------------+--------------------------------------- 
    --------------------+
    | character_set_client     | utf8mb4                                                   
    |
    | character_set_connection | utf8mb4                                                   
    |
    | character_set_database   | utf8mb4                                                   
    |
    | character_set_filesystem | binary                                                    
    |
    | character_set_results    | utf8mb4                                                   
    |
    | character_set_server     | latin1                                                    
    |
    | character_set_system     | utf8                                                      
    |
    | character_sets_dir       | /usr/local/mysql-5.7.23-macos10.13- 
    x86_64/share/charsets/ |
    +--------------------------+--------------------------------------- 
    --------------------+
    8 rows in set (0.01 sec)
观察:

在我同事的本地设置中,这工作正常。那里 java/hibernate使用拉丁语1而不是UTF-8处理输入字符串。 因此,rotebühlstr在DB中编码为cm90ZWL8aGxzdHI=并解码 正确地说是rotebühlstr

^发生这种情况是因为字符集服务器的差异。在我的本地设置为latin1,在同事的本地设置为utf-8

我们迄今为止所做的尝试:

  • 已尝试将“接受字符集”作为拉丁文1发送。没用
  • 修改config.yaml文件以更改mysql的字符集设置。没用
我现在能做的是:

我可以编写一个包装层来进行编码和解码,并停止使用@ColumnTransformer。这样问题就可以解决了


谢谢

我有一次遇到了字符集问题,唯一能解决这个问题的字符集是utf8mb4。正如我所记得的,这个问题源于utf8不能支持某些字符


此外,有关更多信息,您也可以查看

它适用于您的同事,但不适用于您的终端,因为您的终端使用拉丁字符集连接,即使数据库和字段可能是utf8mb4

您希望找到您的mysql配置,并在其部分中添加这些选项。如果缺少部分,请创建它们

[mysql]
default-character-set=utf8mb4

[client]
default-character-set=utf8mb4

[mysqld]
character_set_server = utf8mb4
collation_server = utf8mb4_general_ci

退出所有客户端,重新启动服务器,您应该会没事的。从现在开始,当您执行
显示创建数据库
显示创建表
时,您将看到它的编码错误。

我们使用utf8mb4进行编码,utf8mb4\u unicode\u ci作为排序规则。它在某人的本地工作,但在某些地方不工作,因此可能与数据库的本地设置有关。我将按照答案中的建议尝试使用utf8mb4和utf8mb4_unicode_520_ci。我没有更改mysql数据库的默认设置。然后我认为它工作的时间可能也有默认设置。好luckI尝试了你的建议。它不起作用。my.cnf如下:[mysql]默认字符集=utf8mb4[客户端]默认字符集=utf8mb4#默认自制mysql服务器配置[mysqld]字符集#服务器=utf8mb4排序规则(U服务器=utf8mb4)常规#ci#仅允许从本地主机绑定地址进行连接=127.0.0.1我停止了mysql服务器并重新启动。show create table为我的列显示以下内容:
name
varchar(200)字符集utf8mb4 COLLATE utf8mb4\u unicode\u ci NOT NULL,谢谢!如果它在语句中显示字符集,则表示它与您所连接的字符集不同。否则将隐藏该字符集。可能在某个地方读取了另一个配置,将客户端的字符集设置为其他内容。请尝试使用
mysql--default character set=utf8mb4
打开控制台,或运行
显示变量,如“character\u set\%”命令,查看是否有错误。
character\u set\u system
值是一个您无法以任何方式控制的值。character\u set\u server:latin1这是我唯一看到latin1的值。我将添加显示变量的结果,如“character_set_u%”;在问题描述中。