最近领导让我研究一下 Emoji 存入数据库的问题,所以写这篇文章来记录一下
一、第一种解决方式,直接转换
1. 依赖
我采用的是 mysql-5.7.18 版本,SpringBoot 是 2.7
需要导入 emoji-java 包
<dependency>
<groupId>com.vdurmont</groupId>
<artifactId>emoji-java</artifactId>
<version>4.0.0</version>
</dependency>
2. 前端
才用的是 Thymeleaf
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div th:each="e:${emojis}">
<span th:text="${e.id}"></span>
<span th:text="${e.emojiText}"></span>
<span th:text="${e.by1}"></span>
</div>
<!-- /*@thymesVar id="emoji" type="com.example.emoji_mysql.domain.Emoji"*/-->
<form name=”form” method="post" th:action="@{/add}" th:object="${emoji}">
<label>表情
<input type="text" th:field="*{emojiText}">
</label>
<label>备注
<input type="text" th:field="*{by1}">
</label>
<input type="submit" name="submit" value="提交">
</form>
</body>
</html>
3. 后端
3.1 Controller
@RequestMapping
@Controller
public class IndexController {
@Autowired
EmojiService emojiService;
@RequestMapping("/index")
public String index(ModelMap map,Model model){
// 查询数据库中所有的数据
List<Emoji> list = emojiService.list();
// 将 emoji 的编码转为 表情
Collection<Emoji> collect = list.stream().map(e -> {
// parseToUnicode:转为 unicode 编码,浏览器可识别
e.setEmojiText(EmojiParser.parseToUnicode(e.getEmojiText()));
return e;
}).collect(Collectors.toList());
// 前端遍历的数据
map.put("emojis", collect);
// 创建一个新的对象,传给前端,因为 thymeleaf 上传的话是需要一个空对象的
Emoji emoji = new Emoji();
model.addAttribute("emoji",emoji);
return "index";
}
@PostMapping(value = "/add")
public String add(@ModelAttribute("emoji") Emoji emoji, Model model){
emoji.setId(UUID.randomUUID().toString());
// 将前端传递过来的数据转为 表情的别名,便于存入数据库中
String s = EmojiParser.parseToAliases(emoji.getEmojiText());
emoji.setEmojiText(s);
// 保存
emojiService.save(emoji);
return "index";
}
}
业务层处理的话直接继承 IService 即可
3.2 数据库
CREATE TABLE `emoji_test`.`emoji` ( `id` VARCHAR(32) NOT NULL, `emoji_text` VARCHAR(256), `by1` VARCHAR(256), PRIMARY KEY (`id`) ) CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
第一种方法结果
第二种方法,修改数据库
修改数据库需要 my.cnf 文件,5.7.18之后,如果是用压缩包安装的方式,那么文件夹是没有 my.cnf 这个文件的。
1. 创建 my.cnf 文件
- 停止 mysql 服务,因为是压缩安装的,使用这个命令:pkill mysql
- vim /etc/my.cnf
- 写入参数
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-client-handshake=FALSE
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
- 重启 mysql,去 mysql 的 bin 目录下,
./mysqld_safe & - 进入 Mysql,
./mysql -uroot -p - 查看编码
SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';
如果是新创建的表的话,需要设置字符集
如果是已经存在的表需要修改的话
//修改数据库字符集编码
ALTER DATABASE 你的表名 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
//修改表字符集编码
ALTER TABLE 你的表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
//修改字段字符集编码
ALTER TABLE 你的表名 table_name CHANGE column_name VARCHAR(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
数据库配置