MySQL中真正意义上的UTF8编码

总所周知,目前的软件体系中运用最广泛的是Unicode字符集,而其中运用最多的编码规则就是UTF-8。用UTF-8有什么好处呢?简单的来说有一下几种好处:

  1. 乱码不会扩散, GB2312在丢失一字节等情况下会造成后续所有文字变成乱码。
  2. 不会产生错误的搜索结果, GB2312在搜索的时候相邻两个中文会拼出一个新的字符,导致出现错误的搜索结果。
  3. 更大的字符集。
  4. 很多语言直接支持 UTF-8,部分语言存储字符串到内存时直接使用UTF-8编码。
  5. 与 GB2312/GB18030相比, UTF-8是一个通用解决方案。
  6. 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编码官方有个小建议如下:

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.
大意如下:
为了节省空间 utf8mb4,请使用 VARCHAR而不是CHAR。否则,MySQL必须为CHAR CHARACTER SET utf8mb4列中的每个字符保留四个字节,因为这是最大可能的长度。例如,MySQL必须为一CHAR(10) CHARACTER SET utf8mb4 列保留40个字节。

那如何设置MySQL的编码呢?

  1. 查看数据库服务器的版本,低于5.5.3则不支持utf8mb4。
select VERSION();

+-----------+
| VERSION() |
+-----------+
| 5.5.53    |
+-----------+
  1. 查看数据库的编码
mysql> 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环境

vi /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表情符就可以成功的保存在数据库中了

相关文章

此处评论已关闭