前言

Github:https://github.com/HealerJean

博客:http://blog.healerjean.com

一、mysql 无法存储表

1、问题和背景

博主在开发微信公众号获取用户姓名的时候,出现了很大的问题,一开始只是设计的数据库的编码为UTF-8,但是在当用户的 nickName 设置为表情的符号的时候就会出错,

utf8 最大的一个特点,就是它是一种变长的编码方式。它可以使用 1~4 个字节表示一个符号,根据不同的符号而变化字节长度。其中 Emoji 表情是4个字节,而MySqlutf8 编码最多 3 个字节,所以导致了数据插不进去。

WX20180607-154736@2x

2、解决

mysql 从 5.5.3 开始支持 utf8mb4

-- 创建数据库
create database duodian default character set utf8mb4 collate utf8mb4_unicode_ci ;

-- 修改数据库
ALTER DATABASE duodianyouhui CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ;

-- 修改表
ALTER TABLE user_info CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ;

-- 修改字段
alter table user_info modify column nickName varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci

二、存储表情是乱码

前面的已经介绍了怎么存储 Emoji, 但是我们会发现存到库里是乱码的形式,但是乱码又能怎么样的,能用不就行了。但是我们非让他不显示乱码怎么办呢,有解决方式。这里的解决方式不仅针对 utfbm4 针对 utf8 也是管用的

1、pom.xml

<dependency>
     <groupId>com.vdurmont</groupId>
     <artifactId>emoji-java</artifactId>
    <version>3.2.0</version>
</dependency>

2、表情 string 转化

原理:😁我可以存储为:smile:,😭存储为:cry:,等等,可以这样映射起来。

EmojiParser.parseToAliases(string); 将表情符号转为字符
EmojiParser.parseToUnicode(string); 将字符转为表情符号


@RequestMapping("/add/content")
public ResponseEntity insertContent(@RequestBody Content content) {
    String title = content.getTitle();
    String titles = EmojiParser.parseToAliases(title);
    content.setTitle(titles);
    Integer integer = emojiMapper.insertContent(content);
    if (integer == 1) {
        return ResponseEntity.ok().build();
    }
    return  ResponseEntity.badRequest().build();
}

@RequestMapping("/get/{id}")
public Content getById(@PathVariable("id") Integer id) {
    Content content = emojiMapper.selectById(id);
    String title = EmojiParser.parseToUnicode(content.getTitle());
    content.setTitle(title);
    if (content != null) {
        return content;
    }
    return  null;
}

WX20180607-162928@2x

三、问题

1、字符集设置为 utf8mb4,还是无法存储原因

1、数据库连接字符集:尽管表的字符集是 utf8mb4,但如果数据库连接没有正确配置为使用 utf8mb4,那么在将数据发送到数据库时可能会发生字符编码转换,导致无法正确存储表情符号。请确保您的数据库连接字符串中包含了 useUnicode=true&characterEncoding=UTF-8(对于 JDBC 连接)或相应的设置,以确保连接使用 utf8mb4 编码。

2、数据库服务器配置:在某些情况下,数据库服务器的全局或会话级别的字符集配置可能会覆盖表级别的设置。您可以通过运行以下SQL 命令来检查当前会话的字符集设置:

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

确保 character_set_servercharacter_set_clientcharacter_set_connectioncharacter_set_results 都设置为 utf8mb4

3、数据库驱动:确保您使用的数据库驱动支持 utf8mb4。对于较旧的数据库驱动版本,可能不支持 utf8mb4

4、数据库版本:某些较旧的 MySQL 版本可能不完全支持 utf8mb4。请确保您的 MySQL 服务器版本至少为 5.5.3 或更高,因为从 5.5.3 版本开始,MySQL 才正式支持 utf8mb4 字符集。

ContactAuthor