mysql中utf-8和utf8mb4选择使用

最近在研发过程中,发现前端传递的表情符号无法存入到mysql表中。查询了下,发现mysql需要使用utf8mb4进行编码。

为了搞清楚其中的原因,特意找到了这篇文章。现在将文章主要内容记录下来,有兴趣的还是去看看原文。
核心:如果要支持unicode,那么记得使用utf8mb4,不要用utf8

UTF-8编码

utf-8编码采用可变的1到4个字节来进行字符的编码(U+00000 ~ U+10FFFF)。比如ASCII字符只用一个字节(8bit)来进行表示,而汉字需要2到3个字节来表示。utf-8能够表示1114112个字符(大概一百多万个字符)

MySQL中的utf8字段

Mysql中的utf8只能存储具有1到3个字节的unicode字符,对于需要4个字节编码的unicode字符无法支持。比如将emoji表情(4个字节)存入到utf8字段下,是会失败的。同时原文中提到会有安全问题。

Mysql中的utf8mb4字段

MySQL5.5.3(2010年发布)中引入了一种新的编码utf8mb4。能够完全支持utf8编码,既对于4字节的unicode字符也能完全存储。

修改mysql数据库编码格式

mysql中可以分别指定数据库,表以及表中字段的编码格式。

修改数据库编码格式
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

注:COLLATE表示排序规则,集中常用的排序介绍

  1. utf8mb4_unicode_ci: 基于标准unicode进行排序,在各种语言之间精确排序;
  2. utf8mb4_general_ci: 没有实现unicode排序规则,遇到特殊语言或字符集,排序结果可能不一致;性能会更快一些
  3. utf8mb4_bin:区分大小写。mysql中默认不区分大小写

然而平常开发过程中不要特别关注排序规则,但是要保证编码格式和排序规则要统一。

总结:使用utf8mb4,不要使用utf8

参考文章

  1. https://mathiasbynens.be/notes/mysql-utf8mb4

你可能感兴趣的:(mysql中utf-8和utf8mb4选择使用)