写点什么

MySQL 8.0 字符集与比较规则介绍

作者:Simon
  • 2024-07-24
    浙江
  • 本文字数:3950 字

    阅读完需:约 13 分钟

MySQL 8.0 字符集与比较规则介绍

前言:


我们都知道 MySQL 8.0 与 MySQL 5.7 的区别之一就是默认字符集从 latin1 改成了 utf8mb4 ,除此之外,MySQL 8.0 下的字符集和比较规则还有没有其他变化呢?本篇文章我们一起来学习下。

utf8mb4 字符集

在 MySQL 8.0 中,utf8mb4 字符集是默认的字符集设置,它是一个真正的 4 字节 UTF-8 编码,能够存储任何 Unicode 字符,包括表情符号、特殊符号以及其他复杂的文字。


utf8mb4 的使用场景包括但不限于:


  • 存储超出 utf8mb3 范围的字符,如某些不常用的汉字和新增的 Unicode 字符。

  • 存储 emoji 表情,这些表情需要四字节的编码。

  • 确保数据库能够支持国际化应用,处理各种语言和特殊字符 。


utf8mb4 是 utf8 的超集,完全兼容它,并且理论上将原有的 utf8(实际上是 utf8mb3)修改为 utf8mb4 不会对已有的数据产生问题。


# 查看数据库支持的字符集# Default collation 列列出了该字符集的默认比较规则,Maxlen 列指出了每个字符的最大字节数mysql> SHOW CHARACTER SET;+----------+---------------------------------+---------------------+--------+| Charset  | Description                     | Default collation   | Maxlen |+----------+---------------------------------+---------------------+--------+| armscii8 | ARMSCII-8 Armenian              | armscii8_general_ci |      1 || ascii    | US ASCII                        | ascii_general_ci    |      1 |...| utf8mb3  | UTF-8 Unicode                   | utf8mb3_general_ci  |      3 || utf8mb4  | UTF-8 Unicode                   | utf8mb4_0900_ai_ci  |      4 |+----------+---------------------------------+---------------------+--------+41 rows in set (0.01 sec)
# 查看系统字符集mysql> SHOW VARIABLES LIKE 'character_set%';+--------------------------+----------------------------------+| 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 | utf8mb3 || character_sets_dir | /usr/local/mysql/share/charsets/ |+--------------------------+----------------------------------+8 rows in set (0.01 sec)
复制代码

utf8mb4_0900_ai_ci 比较规则

MySQL 8.0 版本下,utf8mb4 默认的比较规则是 utf8mb4_0900_ai_ci ,而 MySQL 5.7 utf8mb4 默认的比较规则是 utf8mb4_general_ci ,下面我们一起来看下 utf8mb4 字符集下的比较规则。


# MySQL 8.0 版本utf8mb4字符集下的比较规则mysql> SHOW COLLATION WHERE Charset = 'utf8mb4';+----------------------------+---------+-----+---------+----------+---------+---------------+| Collation                  | Charset | Id  | Default | Compiled | Sortlen | Pad_attribute |+----------------------------+---------+-----+---------+----------+---------+---------------+| utf8mb4_0900_ai_ci         | utf8mb4 | 255 | Yes     | Yes      |       0 | NO PAD        || utf8mb4_0900_as_ci         | utf8mb4 | 305 |         | Yes      |       0 | NO PAD        || utf8mb4_0900_as_cs         | utf8mb4 | 278 |         | Yes      |       0 | NO PAD        || utf8mb4_bin                | utf8mb4 |  46 |         | Yes      |       1 | PAD SPACE     || utf8mb4_general_ci         | utf8mb4 |  45 |         | Yes      |       1 | PAD SPACE     || utf8mb4_german2_ci         | utf8mb4 | 244 |         | Yes      |       8 | PAD SPACE     || utf8mb4_swedish_ci         | utf8mb4 | 232 |         | Yes      |       8 | PAD SPACE     |...| utf8mb4_vi_0900_as_cs      | utf8mb4 | 300 |         | Yes      |       0 | NO PAD        || utf8mb4_zh_0900_as_cs      | utf8mb4 | 308 |         | Yes      |       0 | NO PAD        |+----------------------------+---------+-----+---------+----------+---------+---------------+89 rows in set (0.00 sec)
# 查看系统比较规则mysql> SHOW variables like 'coll%';+----------------------+--------------------+| Variable_name | Value |+----------------------+--------------------+| collation_connection | utf8mb4_0900_ai_ci || collation_database | utf8mb4_0900_ai_ci || collation_server | utf8mb4_0900_ai_ci |+----------------------+--------------------+3 rows in set (0.01 sec)
# MySQL 5.7 版本utf8mb4字符集下的比较规则admin@localhost [(none)] 16:03:33>SHOW COLLATION WHERE Charset = 'utf8mb4';+------------------------+---------+-----+---------+----------+---------+| Collation | Charset | Id | Default | Compiled | Sortlen |+------------------------+---------+-----+---------+----------+---------+| utf8mb4_general_ci | utf8mb4 | 45 | Yes | Yes | 1 || utf8mb4_bin | utf8mb4 | 46 | | Yes | 1 || utf8mb4_unicode_ci | utf8mb4 | 224 | | Yes | 8 || utf8mb4_icelandic_ci | utf8mb4 | 225 | | Yes | 8 || utf8mb4_latvian_ci | utf8mb4 | 226 | | Yes | 8 || utf8mb4_romanian_ci | utf8mb4 | 227 | | Yes | 8 || utf8mb4_slovenian_ci | utf8mb4 | 228 | | Yes | 8 || utf8mb4_polish_ci | utf8mb4 | 229 | | Yes | 8 || utf8mb4_estonian_ci | utf8mb4 | 230 | | Yes | 8 || utf8mb4_spanish_ci | utf8mb4 | 231 | | Yes | 8 || utf8mb4_swedish_ci | utf8mb4 | 232 | | Yes | 8 || utf8mb4_turkish_ci | utf8mb4 | 233 | | Yes | 8 || utf8mb4_czech_ci | utf8mb4 | 234 | | Yes | 8 || utf8mb4_danish_ci | utf8mb4 | 235 | | Yes | 8 || utf8mb4_lithuanian_ci | utf8mb4 | 236 | | Yes | 8 || utf8mb4_slovak_ci | utf8mb4 | 237 | | Yes | 8 || utf8mb4_spanish2_ci | utf8mb4 | 238 | | Yes | 8 || utf8mb4_roman_ci | utf8mb4 | 239 | | Yes | 8 || utf8mb4_persian_ci | utf8mb4 | 240 | | Yes | 8 || utf8mb4_esperanto_ci | utf8mb4 | 241 | | Yes | 8 || utf8mb4_hungarian_ci | utf8mb4 | 242 | | Yes | 8 || utf8mb4_sinhala_ci | utf8mb4 | 243 | | Yes | 8 || utf8mb4_german2_ci | utf8mb4 | 244 | | Yes | 8 || utf8mb4_croatian_ci | utf8mb4 | 245 | | Yes | 8 || utf8mb4_unicode_520_ci | utf8mb4 | 246 | | Yes | 8 || utf8mb4_vietnamese_ci | utf8mb4 | 247 | | Yes | 8 |+------------------------+---------+-----+---------+----------+---------+26 rows in set (0.00 sec)
复制代码


以上对比可以看出 MySQL 8.0 版本 utf8mb4 字符集下的比较规则多达 89 种,而 MySQL 5.7 只有 26 种,少的 63 种都是带 0900 标识的。并且 MySQL 8.0 版本 utf8mb4 字符集默认的比较规则 utf8mb4_0900_ai_ci 在 5.7 版本中是不存在的。


查阅官方文档得知,0900 标识符的比较规则是在 MySQL 8.0 版本中引入的,是基于 Unicode Collation Algorithm (UCA) 9.0.0 标准的比较规则,能提供更精确、更现代的 Unicode 支持。


其余标识符就是比较常见的了,ci(case-insensitive):不区分大小写,cs(case-sensitive):区分大小写,ai(accent-insensitive):不区分重音符号,as(accent-sensitive):区分重音符号。


utf8mb4_0900_ai_ci 比较规则不区分大小写且不区分重音符号,遵循更新版的 Unicode 标准,更好地支持了国际化和多语言环境。MySQL 8.0 建议采用此比较规则,它可以看作是 utf8mb4_general_ci 的升级版,二者之间区别很小,在 8.0 版本下的区别之一是:utf8mb4_0900_ai_ci 不忽略末尾空格,而 utf8mb4_general_ci 忽略末尾空格,即 'abc ' 和 'abc' 在 utf8mb4_0900_ai_ci 比较规则下认为是不相等的,而在 utf8mb4_general_ci 下是相等的。


总结:


本篇文章介绍了 MySQL 8.0 版本中 utf8mb4 字符集及其比较规则,建议 8.0 版本保持默认即可。如果你的数据库是由 5.7 版本升级或迁移来的,建议保持使用原先的 utf8mb4_general_ci 字符集。不过需要注意的是,因 MySQL 5.7 没有 utf8mb4_0900_ai_ci 比较规则,若有库表使用此比较规则来导入 5.7 版本,则会报错无法执行。

发布于: 刚刚阅读数: 5
用户头像

Simon

关注

MySQL技术学习者 2018-06-08 加入

公众号『MySQL技术』作者

评论

发布
暂无评论
MySQL 8.0 字符集与比较规则介绍_MySQL_Simon_InfoQ写作社区