双编码utf-8字符串-mysql,hibernate

p4rjhz4m  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(423)

在使用hibernate对base64进行编码之后,我们正在mysql db中保存一个字符串。
以下是执行此操作的代码:

@Basic
    @Column(name = "name", nullable = false)
    @ColumnTransformer(read = "FROM_BASE64(name) ", write ="TO_BASE64(?)")
    public String getName()

现在,当我救罗特布的时候ühlstr,它被保存在数据库中,名为cm90zwldvghsc3ry。当我在终端上打印它时,它显示为rotebã¼hlstr应该在哪里ü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。所以,罗特布ühlstr在db中编码为cm90zwl8agxzdhi=并正确解码为rotebühlstr公司。
^这是因为字符集和服务器的不同。在我的本地设置为拉丁1,在同事的本地设置为utf-8。
我们迄今为止的尝试:
尝试将“accept charset”作为拉丁文1发送。没用。
修改config.yaml文件以更改mysql的字符集设置。不起作用
我现在能做的是:
我可以写一个 Package 层编码和解码,并停止使用@columntransformer。这样问题就可以解决了。
谢谢。

ndasle7k

ndasle7k1#

它适用于您的同事,但不适用于您的终端,因为您的终端与拉丁字符集相连,即使数据库和字段可能是utf8mb4。
你想找到你的mysql配置并在它们的部分中添加这些选项。如果缺少部分,请创建它们。

[mysql]
default-character-set=utf8mb4

[client]
default-character-set=utf8mb4

[mysqld]
character_set_server = utf8mb4
collation_server = utf8mb4_general_ci

退出任何客户机,重新启动服务器,你应该没事。从现在起,当你 show create database 或者 show create table 你会看到什么时候是错误的编码。

w9apscun

w9apscun2#

我有一次遇到了字符集的问题,唯一能解决这个问题的字符集是utf8mb4。我记得这个问题是因为utf8不能支持某些字符。
此外,有关更多信息,您可以查看https://stackoverflow.com/a/43692337/2137378 我也是。

相关问题