总所周知,目前的软件体系中运用最广泛的是Unicode字符集,而其中运用最多的编码规则就是UTF-8。用UTF-8有什么好处呢?简单的来说有一下几种好处:
- 乱码不会扩散, GB2312在丢失一字节等情况下会造成后续所有文字变成乱码。
- 不会产生错误的搜索结果, GB2312在搜索的时候相邻两个中文会拼出一个新的字符,导致出现错误的搜索结果。
- 更大的字符集。
- 很多语言直接支持 UTF-8,部分语言存储字符串到内存时直接使用UTF-8编码。
- 与 GB2312/GB18030相比, UTF-8是一个通用解决方案。
- Unicode 一直有人维护,而 GB18030 下一次更新不知道会是什么时候了。另对于中文, UTF-8和GB2312在gzip压缩后都差不多,所以用来做网页对带宽影响很小。 MySQL中也有UTF-8编码,他还有另外一个称呼叫做utf8mb3,该字符集每个字符最多使用三个字节。三个字节的UTF-8最大能编码的 Unicode字符是0xffff,也就是Unicode中的基本多文种平面(BMP)。也就是说,任何不在基本多文本平面的 Unicode字符,都无法使用MySQL的UTF-8编码存储。包括Emoji表情(Emoji是一种特殊的Unicode 编码,常见于ios和 android手机上),和很多不常用的汉字,以及任何新增的 Unicode字符等等。这样的话就会出现一些特殊字符无法保存到MySQL中。接下来我们就来解决这个编码的问题!
随着Unicode的字符集的规范确定,以及他的广泛应用,MySQL官方自己也发现了这个问题,于是乎官方在MySQL5.5.3的时候推出了utf8mb4编码,(他才是真正意义上的UTF-8编码)mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。
对于新增的utf8mb4编码官方有个小建议如下:
1 | Tip: To save space with utf8mb4, use VARCHAR instead of CHAR. Otherwise, MySQL must reserve four bytes for each character in a CHAR CHARACTER SET utf8mb4 column because that is the maximum possible length. For example, MySQL must reserve 40 bytes for a CHAR(10) CHARACTER SET utf8mb4 column. |
那如何设置MySQL的编码呢?
查看数据库服务器的版本,低于5.5.3则不支持utf8mb4。
1
2
3
4
5
6
7select VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.5.53 |
+-----------+查看数据库的编码
1
2
3
4
5
6
7
8
9
10
11
12
13
14mysql> show variables like 'character%';
+--------------------------+-----------------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | C:\phpStudy\MySQL\share\charsets\ |
+--------------------------+-----------------------------------+将上述utf8全部修改成utf8mb4,编辑mysql的配置文件/etc/my.cnf(具体还可以参照文章Centos6.9上搭建lnmp环境)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36vi /etc/my.cnf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8_general_ci
sql_mode='NO_ENGINE_SUBSTITUTION'
[mysql]
default-character-set = utf8mb4
[mysql.server]
default-character-set = utf8mb4
[mysqld_safe]
default-character-set = utf8mb4
[client]
default-character-set = utf8mb4
#重启mysql
service mysqld restart
#再次查看
mysql> show variables like 'character%';
+--------------------------+-----------------------------------+
| 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 | utf8mb4 |
| character_set_system | utf8mb4 |
| character_sets_dir | C:\phpStudy\MySQL\share\charsets\ |
+--------------------------+-----------------------------------+这样我们的数据库就编码就全都设置成了utf8mb4,一些特殊的中文字符和Emoji表情符就可以成功的保存在数据库中了