云计算、AI、云原生、大数据等一站式技术学习平台

网站首页 > 教程文章 正文

如何在 MySQL 中设置默认的字符集和排序规则

jxf315 2024-12-23 11:16:25 教程文章 32 ℃

在MySQL中,字符集的选择和排序规则的设置会直接影响到数据库数据的存储以及字符串的处理性能。所谓的字符集(character set)是在MySQL数据库中定义的一组字符及其编码,而排序规则(collation)定义的字符的比较和排序规则。通过默认字符集和排序规则的配置可以有效的避免出现各种的字符编码问题,同时还可以有效的提高系统数据格式的兼容性。下面我们就来详细介绍一下如何设置MySQL的默认字符集以及排序规则。

什么是字符集和排序规则?

在上面的介绍中,我们提到,字符集其实是一个字符的集合,这集合为每个字符分配了一个唯一的编码规则,例如MySQL中常见的编码规则。

  • utf8mb4:支持所有Unicode字符,推荐使用。
  • latin1:MySQL的传统字符集,只支持基本的拉丁字符。

而所谓的排序规则是指字符集合的复杂属性操作,在排序规则中指定的是如何对字符集中字符进行比较和排序,如下所示,是MySQL中常见的字符排序规则。

  • utf8mb4_general_ci:大小写不敏感的通用排序规则。
  • utf8mb4_bin:二进制排序规则,区分大小写。

为什么要设置默认字符集和排序规则?

说了这么多?很多人还不了解为什么要为数据库设计字符集以及排序规则。设置数据库字符集和排序规则可以有效的避免因为不同的字符编码导致的字符显示异常的问题,通过统一的字符集以及排序规则的设计我们可以减少手动去进行字符转换的操作,提升了数据操作的效率,另外作为默认的字符集utf8mb4几乎可以表示现实世界中所有的语言以及符号,这里所说的符号包括表情符号。

设置默认字符集和排序规则的方法

在 MySQL 配置文件中设置

这种方式是一种全局的配置方式,适用于整个的MySQL实例。可以在MySQL的配置文件my.cnf或者是my.ini的[mysqld]部分中添加如下的配置来实现。

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci

配置完成之后,我们需要重启MySQL服务确保配置生效。

sudo systemctl restart mysql

通过如下的方式来验证上面的配置是否起作用。

SHOW VARIABLES LIKE 'character_set_server';
SHOW VARIABLES LIKE 'collation_server';

在创建数据库时设置

当然如果不想进行全局的配置,那么我们可以在创建数据库的时候对数据进行单独字符集以及排序规则的设置,如下所示。

CREATE DATABASE my_database
CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;

创建完成之后,我们可以通过如下的方式来验证是否设置成功了。

SELECT schema_name, default_character_set_name, default_collation_name
FROM information_schema.schemata
WHERE schema_name = 'my_database';

在创建表时设置

如果只需要在特定的数据库表中使用指定的字符集以及排序规则,我们可以在创建数据库表的时候对其字符集以及排序规则进行指定,如下所示。

CREATE TABLE my_table (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100)
) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

可以通过如下的方式来验证是否配置成功。或者是可以通过它来查看现有库表的字符集以及排序规则。

SHOW TABLE STATUS LIKE 'my_table';

修改已有的数据库或表

如果需要对现有已经存在的库表结构进行字符集和排序规则的修改,我们可以通过ALTER语句来进行操作,

修改数据库的字符集以及排序规则。

ALTER DATABASE my_database
CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;

修改数据表的字符集和排序规则

ALTER TABLE my_table
CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

检查MySQL当前的字符集和排序规则

当然在不知道当前数据库表是什么字符集和排序规则的时候,我们可以通过如下的命令来查看MySQL数据库的字符集和排序规则。

检查全局字符集和排序规则

SHOW VARIABLES LIKE 'character_set_%';
SHOW VARIABLES LIKE 'collation_%';

检查数据库级别的设置

SELECT schema_name, default_character_set_name, default_collation_name
FROM information_schema.schemata;

检查数据库表级别的配置

SHOW TABLE STATUS WHERE Name = 'my_table';

检查数据表列级别的字符集配置

SELECT column_name, character_set_name, collation_name
FROM information_schema.columns
WHERE table_name = 'my_table';

常见问题和解决方案

首先比较常见的问题就是因为字符集不匹配导致数据乱码,我们可以通过如下的方式来配置客户端和服务器端使用了同样的字符集。

[client]
default-character-set = utf8mb4

其次,在一些场景中由于排序规则的不同可能会导致系统查询性能受到一定的影响,例如对于排序规则来说utf8mb4_unicode_ci的排序虽然准确但是效率较低,如果对于系统性能要求较高可以采用utf8mb4_general_ci排序来实现,又如,在一些场景中需要大小写敏感,这个时候我们可以通过utf8mb4_bin来实现排序规则检查。

最后遇到的比较多的就是表示范围,一般情况下在系统中需要确保使用utf8mb4字符集而不是utf8字符集,因为utf8不支持4字节字符,所以对于有些中文存储可能不是太友好。

总结

通过对MySQL字符集和排序规则的设置可以有效的解决中文编码问题,可以提高系统的兼容性以及扩展可用性。在实际使用的时候,我们可以根据自己的实际应用程序的情况来选择合适的方式来配置字符集和排序规则。

最近发表
标签列表