mysql字符集CHARACTERSET之utf8mb4

MySQL 中的 utf8mb4 是一种字符集,它能够存储 Unicode 字符,并且能够处理所有的 Unicode 字符。它是 UTF-8 编码的一种扩展,能够支持多字节字符。下面详细解释 utf8mb4 的背景、特性、优点和如何在 MySQL 中使用它。

1. 字符集与编码概念

  • 字符集(Character Set):表示字符与其二进制表示之间的映射方式。在 MySQL 中,字符集定义了可以存储的字符集范围。
  • 编码(Collation):定义了字符的排序和比较规则。

2. utf8mb4utf8 的区别

MySQL 提供了多个 UTF 编码字符集,其中最常用的是 utf8utf8mb4

  • utf8:MySQL 中的 utf8 字符集实际上只支持最多 3 个字节来表示字符。这意味着它不能完全支持 Unicode 字符集中的所有字符,尤其是一些超出基本多语言平面(BMP)的字符。例如,一些表情符号、古文字和其他特殊字符无法通过 utf8 来存储。

    • utf8 最多能表示 3 字节的字符。
    • 支持的字符范围是 Unicode 字符集中的 U+0000 到 U+FFFF 之间的字符。
  • utf8mb4:这是 UTF-8 编码的完整实现,支持最多 4 个字节的字符,能够表示 Unicode 中的所有字符,包括 BMP 外的字符(例如表情符号和一些非标准字符)。utf8mb4 的字符集包含了 Unicode 所有的字符,并且能够完整地支持表情符号和一些特殊的字符。

    • utf8mb4 最多能表示 4 字节的字符。
    • 支持的字符范围是 Unicode 字符集中的 U+0000 到 U+10FFFF 之间的字符。

3. 为什么选择 utf8mb4

utf8mb4 能够确保 MySQL 数据库能够存储所有的 Unicode 字符,特别是对现代应用程序非常重要的一些字符。例如,表情符号(如 😊)、一些亚洲语言(如汉字扩展、日语假名等)和其他现代符号都包含在 Unicode 中,但 utf8 字符集无法完全支持这些字符。
如果你使用 utf8 字符集并尝试存储 4 字节字符时,可能会遇到错误,或者数据会被截断。而 utf8mb4 则避免了这些问题,是支持 Unicode 字符的标准选择。

4. 如何在 MySQL 中使用 utf8mb4

在创建数据库、表、列时,你可以选择使用 utf8mb4 字符集来确保可以存储所有的 Unicode 字符。

4.1 创建数据库时使用 utf8mb4

CREATE DATABASE mydatabase CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

4.2 创建表时指定 utf8mb4

CREATE TABLE mytable ( id INT PRIMARY KEY, name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci );

4.3 修改现有表的字符集

如果你有一个已经存在的表,且它使用 utf8 字符集,你可以通过以下 SQL 命令将其字符集更改为 utf8mb4
ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

4.4 修改列的字符集

如果只想更改某一列的字符集,可以使用以下命令:
ALTER TABLE mytable MODIFY name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

4.5 设置连接字符集

为了确保从客户端到 MySQL 服务器的数据传输过程中不会出现字符集问题,你也可以设置连接使用 utf8mb4
SET NAMES utf8mb4;

5. MySQL 版本兼容性

  • 从 MySQL 5.5.3 开始,utf8mb4 字符集已经被引入并成为 MySQL 的标准字符集之一。
  • 旧版本的 MySQL(如 5.1 或更早版本)不支持 utf8mb4

6. 性能考虑

使用 utf8mb4 字符集比 utf8 字符集稍微占用更多的存储空间,因为每个字符的最大字节数是 4 而不是 3。因此,在存储大量文本数据时,可能需要更多的存储空间和稍慢的处理速度。不过,现代的硬件和优化过的存储引擎通常能够很好地处理这种增加的开销。

7. 总结

  • utf8mb4 是 MySQL 中支持所有 Unicode 字符的字符集,支持 1 到 4 字节的字符。
  • utf8 字符集只能存储最多 3 字节的字符,无法支持 Unicode 中的所有字符,尤其是某些表情符号和其他特殊字符。
  • 在现代应用中,尤其是需要支持表情符号、国际化文本或者任何非基本平面字符的应用,推荐使用 utf8mb4
  • 通过适当配置字符集和连接设置,可以确保 MySQL 数据库正确处理和存储 Unicode 数据。
    如果你正在创建新数据库或迁移现有数据库,尽量使用 utf8mb4 来避免未来可能出现的字符编码问题。

8.扩展 unicode_ci

在 MySQL 中,字符集(Character Set)和排序规则(Collation)是两个不同的概念。utf8mb4_unicode_ci 是一个 字符集和排序规则的组合,其中:

  • utf8mb4字符集,用于指定如何存储和编码字符。
  • unicode_ci排序规则(Collation),它定义了如何对字符进行比较和排序。

8.1. 字符集(Character Set)

字符集定义了如何将字符映射到字节。在 utf8mb4 中,每个字符可以使用 1 到 4 个字节进行编码,支持 Unicode 字符集中的所有字符,包括表情符号、历史字符等。

8.2. 排序规则(Collation)

排序规则(Collation)则定义了如何对字符进行比较和排序,具体来说:

  • 排序规则 涉及到两个方面:
    1. 字符的比较规则:两个字符是否相等,如何进行字符间的比较(例如大小写)。
    2. 字符的排序规则:在排序时,哪些字符排在前面,哪些排在后面。

8.3. utf8mb4_unicode_ci 的含义

  • utf8mb4:表示使用的是 utf8mb4 字符集(可以存储所有 Unicode 字符)。
  • unicode:指定排序规则基于 Unicode 字符集进行比较和排序。Unicode 排序规则会尽量遵循 Unicode 标准对字符排序的定义,考虑到各种语言的特殊排序需求。
  • ci:表示 不区分大小写(Case Insensitive)。在排序和比较字符时,字母的大小写不会影响比较结果。例如,'a''A' 被视为相同。

8.4. utf8mb4_unicode_ci 的排序行为

  • Unicode 排序规则:Unicode 排序规则(unicode)是一种通用的排序规则,适用于全球的多种语言字符。它基于 Unicode 标准进行字符比较,因此能够很好地处理不同语言的字符排序。例如,在某些语言中,é(带重音符的字母)可能会与 e 排在不同的位置,而 utf8mb4_unicode_ci 会根据 Unicode 标准来处理这些细节。

  • 不区分大小写(ci)ci 表示 "Case Insensitive",即不区分字母的大小写。例如,'a''A' 会被认为是相同的字符,在进行排序或比较时不会区分它们。

举个例子:

  • 比较 'a''A',在 utf8mb4_unicode_ci 的排序规则下,它们会被认为相同,不会因为大小写不同而导致不同的排序位置。
  • 同样,'é''e' 的排序会遵循 Unicode 标准来进行合理的处理。

8.5. 为什么选择 utf8mb4_unicode_ci

  • 兼容性utf8mb4_unicode_ci 可以处理多种语言和字符,不仅适用于英语,还适用于欧洲语言、亚洲语言和其他特殊符号。这使得它成为一个通用且可靠的排序规则,适合多语言环境。

  • 不区分大小写(ci):大多数情况下,应用程序并不需要区分字符的大小写,使用不区分大小写的排序规则(ci)可以简化比较操作,尤其是在用户输入搜索时,大部分用户并不关心字母的大小写。

  • Unicode 兼容性utf8mb4_unicode_ci 遵循 Unicode 标准,可以很好地处理多语言字符集和一些特殊字符(如带重音符的字符、拼音字符等)。它通常比其他排序规则(例如 utf8mb4_general_ci)处理更精确,尤其是在涉及到国际化时。

8.6. 与其他排序规则的区别

除了 utf8mb4_unicode_ciutf8mb4 还有其他一些常见的排序规则:

  • utf8mb4_general_ci:这个排序规则比 utf8mb4_unicode_ci 更简单,不完全遵循 Unicode 标准。它的性能更好,但对于一些特殊语言和字符的排序和比较可能不如 utf8mb4_unicode_ci 精确。对于大多数简单的应用,utf8mb4_general_ci 可能已经足够,但如果应用涉及复杂的多语言排序,utf8mb4_unicode_ci 更为合适。

  • utf8mb4_bin:这个排序规则是 区分大小写(Case Sensitive),也就是 'a''A' 被认为是不同的字符。如果你需要进行区分大小写的比较(例如用户名比较时大小写敏感),可以使用 utf8mb4_bin

8.7. 总结

  • utf8mb4 是 MySQL 支持的一个字符集,能够存储 Unicode 字符。
  • utf8mb4_unicode_ciutf8mb4 字符集的一个排序规则,它基于 Unicode 标准进行字符排序,并且是不区分大小写的。
  • 使用 utf8mb4_unicode_ci 排序规则可以确保支持多种语言的字符排序,并且不区分大小写,适合大多数国际化应用。
  • 如果你有特定的排序需求或者性能要求,可以选择其他排序规则,如 utf8mb4_general_ciutf8mb4_bin

本文作者:Journey&Flower

本文链接:https://www.cnblogs.com/JourneyOfFlower/p/18451455

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Journey&Flower  阅读(85)  评论(0编辑  收藏  举报
历史上的今天:
2022-10-08 ZPL命令 实现打印中文
2022-10-08 [已解决]OpenSSL SSL_connect: Connection was reset in connection to github.com:443
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 404 Not Found REOL
404 Not Found - REOL
00:00 / 00:00
An audio error has occurred.

Fade away

Do over again

Fade away

Utai hajime no hitomojime

Itsumo mayotteru

Douse toritome no nai koto dakedo

Tsutawaranakya motto imi ga nai (Ooh-ooh, oh-oh-oh)

Doushitatte konna ni fukuzatsu nano ni

Kamikudaite yaranakya tsutawaranai

Hora kekkyoku kashi nanka dou datte ii

Boku no ongaku nanka kono yo ni nakutatte ii nda yo

Ii ndarou

Nee sou darou

Everybody don't know why

Everybody don't know much

Boku wa ki ni shinai, kimi wa kidzukanai

Doko ni mo mou inai inai

Everybody don't know why

Everybody don't know much

Wasureteiku, wasurerareteiku

We don't know, we don't know, no, no

Me no mae, hirogaru genjitsu sekai ga mata yuganda

Nando risetto shite mo

Boku wa boku igai no dareka ni wa umare kawarenai

Sonna no shitteru yo

Ki ni naru ano ko no uwasabanashi mo

Shinikaru hyouteki wa tsugi no sokuhou

Mahi shichatteru (Tteru) kokkara esukeepu (Keepu)

Tooku tooku made ikeru yo

Antei nante nai (Na-na-na-na)

Fuanteina sekai (Na-na-na-na)

Antei nante nai (Na-na-na-na)

Kitto ashita ni wa wasureru yo

Fade away

Do over again

Fade away

Souda sekai wa dokoka ga itsumo uso kusai

Kireigoto dake ja daijina hitotachi sura mamorenai

Kudaranai, bokura minna dokoka kurutteru mitai

Hontou no koto nanka zenbu kamisama mo shiranai

Kamisama mo shiranai (Woah, woah, woah, no, woah)

Kamisama mo shiranai (Woah, woah, woah, no, woah)

Kamisama mo shiranai, but

Kamisama mo shiranai (Woah, no, woah, no, woah)

Everybody don't know why

Everybody don't know much

Boku wa ki ni shinai, kimi wa kidzukanai

Doko ni mo mou inai inai

Everybody don't know why

Everybody don't know much

Wasureteiku, wasurerareteiku

We don't know, we don't know, oh, oh-oh-oh

Ahh, oh-oh-oh-oh

Woah, oh-oh-oh

Ooh, ooh, ooh, ooh-ooh-ooh-ooh