沃梦达 / IT编程 / 数据库 / 正文

MySQL 编码utf8 与 utf8mb4 utf8mb4_unicode_ci 与 utf8mb4_general_ci

MySQL是一个关系型数据库,支持多种字符编码。其中,UTF-8是目前最为常用的字符编码方式之一,但UTF-8也有多种可选的扩展,如utf8mb4,utf8mb4_unicode_ci,以及utf8mb4_general_ci。在使用时需要注意它们之间的区别。

MySQL是一个关系型数据库,支持多种字符编码。其中,UTF-8是目前最为常用的字符编码方式之一,但UTF-8也有多种可选的扩展,如utf8mb4,utf8mb4_unicode_ci,以及utf8mb4_general_ci。在使用时需要注意它们之间的区别。

UTF-8 和 UTF-8mb4

UTF-8是Unicode的一种编码方式,适用于1-3个字节的字符编码,但是,UTF-8无法支持4个字节的字符编码,这就导致了它无法存储一些Emoji表情等特殊字符。因此,MySQL提供了一种扩展的字符编码方式:utf8mb4。该编码方式支持4个字节的字符编码,能够存储绝大部分字符。

utf8mb4_general_ci 和 utf8mb4_unicode_ci

在MySQL中,utf8mb4编码方式有两种排序规则:utf8mb4_general_ci和utf8mb4_unicode_ci。这两种排序规则主要区别在于对一些字符的处理方式不同。

utf8mb4_general_ci基于Unicode规则进行排序,但它会忽略字符集的一些细节,比如不区分大小写,不区分一些特殊字符等,它在一定情况下对排序有着较好的性能。utf8mb4_unicode_ci基于Unicode Collation Algorithm来排序,处理方式比utf8mb4_general_ci更加精细,它能够区分不同的大小写,以及一些特殊字符。但由于它需要较多的计算,因此性能不如utf8mb4_general_ci。

配置MySQL使用utf8mb4

以下是配置MySQL使用utf8mb4编码方式的详细过程。

1. 修改MySQL配置文件

需要修改MySQL的配置文件my.cnf(也可能是/etc/mysql/mysql.conf.d/mysqld.cnf)。在该配置文件中找到[mysqld]项,加入以下三行代码:

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
skip-character-set-client-handshake

请注意:该配置是将服务端的默认字符集和排序规则改为utf8mb4和utf8mb4_unicode_ci。但该配置无法修改已有的数据库和表的编码方式,需要进一步修改。

2. 修改已有数据库和表

MySQL中,修改已有的数据库和表的编码方式需要三步:

  1. 重命名要更改编码方式的表或数据库,可以使用ALTER TABLE或RENAME DATABASE语句完成。
  2. 使用CREATE TABLE或CREATE DATABASE语句创建新的表或数据库,其编码方式为utf8mb4。
  3. 将旧表中的数据拷贝至新表中,可以使用INSERT INTO或SELECT INTO语句完成。

下面是两个示例,说明如何配置和使用utf8mb4编码方式

示例1:创建新表使用utf8mb4编码

CREATE TABLE `mytable` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;

该示例代码创建了一个名为Mytable的表,该表的字符编码方式为utf8mb4,排序规则为utf8mb4_general_ci。该表包含三个字段:id,name和content。其中name和content的字符集均为utf8mb4,排序规则为utf8mb4_general_ci。

示例2:修改已有的数据库编码方式

假设有一个数据库名为mydb,已有一个名为Mytable的表,需要将该数据库的字符编码方式改为utf8mb4。按照上述三步操作,依次执行以下代码即可完成:

RENAME DATABASE mydb TO mydb_old;
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE mydb;
CREATE TABLE `Mytable` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;
INSERT INTO mydb.`Mytable` SELECT * FROM mydb_old.`Mytable`;

这段代码在修改已有的数据库时,首先将该数据库重命名为mydb_old,然后创建一个新的mydb数据库,该数据库的字符编码方式为utf8mb4,排序规则为utf8mb4_general_ci。随后在新的数据库mydb中创建了一个名为Mytable的表,并将旧表中的数据拷贝至新表中。

以上就是关于MySQL编码utf8、utf8mb4、utf8mb4_general_ci和utf8mb4_unicode_ci的介绍和完整攻略了。

本文标题为:MySQL 编码utf8 与 utf8mb4 utf8mb4_unicode_ci 与 utf8mb4_general_ci