Mysql存储表情符号
前言
Github:https://github.com/HealerJean
一、mysql
无法存储表
1、问题和背景
博主在开发微信公众号获取用户姓名的时候,出现了很大的问题,一开始只是设计的数据库的编码为
UTF-8
,但是在当用户的nickName
设置为表情的符号的时候就会出错,
utf8
最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4
个字节表示一个符号,根据不同的符号而变化字节长度。其中Emoji
表情是4个字节,而MySql
的utf8
编码最多3
个字节,所以导致了数据插不进去。
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
转化
原理:😁我可以存储为,😭存储为,等等,可以这样映射起来。
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;
}