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编码官方有个小建议如下:

1
2
3
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。

    1
    2
    3
    4
    5
    6
    7
    select VERSION();

    +-----------+
    | VERSION() |
    +-----------+
    | 5.5.53 |
    +-----------+
  2. 查看数据库的编码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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环境

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

  • 作者: Sam
  • 发布时间: 2018-02-22 23:37:26
  • 最后更新: 2019-12-09 23:03:26
  • 文章链接: https://ydstudios.gitee.io/post/451d6526.html
  • 版权声明: 本网所有文章除特别声明外, 禁止未经授权转载,违者依法追究相关法律责任!