MySQL 字符集、排序规则与查询关系最佳实践

 更新时间:2025年06月27日 08:57:55   作者:曾左  
MySQL查询是否区分大小写和重音敏感由字符集与排序规则决定,推荐使用utf8mb4字符集及utf8mb4_general_ci排序规则,本文给大家介绍MySQL字符集、排序规则与查询关系详解,感兴趣的朋友一起看看吧

MySQL 查询是否区分大小写及重音敏感,取决于创建时指定的字符集(character set)和排序规则(collation)。

(1)字符集(Character Set):规定可存储的字符,如 utf8、utf8mb4、latin1 等。

(2)排序规则(Collation):确定字符比较与排序规则,如是否区分大小写、重音等。

注意:

(1)每个排序规则必须对应特定的字符集,如 utf8mb4_bin 仅用于 utf8mb4 字符集。

(2)“重音敏感”(Accent Sensitive):指排序规则将带重音符号的字母视为与基本字母相同或不同的特性,如 'cafe' 与 'café'。

在 MySQL 5.7 中,默认字符集和排序规则是 latin1 和 latin1_swedish_ci。实际应用里,建议使用 utf8mb4 字符集以支持完整 Unicode 字符(含 emoji),并采用默认对应的 utf8mb4_general_ci 排序规则,该规则下查询不区分大小写。

一、常见排序规则

排序规则对应字符集大小写敏感重音敏感适用版本说明
utf8_general_ciutf8所有版本基本 Unicode 比较
utf8mb4_general_ciutf8mb45.5.3+默认的 utf8mb4 排序规则
latin1_swedish_cilatin1所有版本传统西欧默认排序规则
utf8mb4_unicode_ciutf8mb45.5.3+符合 Unicode 标准的更准确排序
utf8mb4_0900_ai_ciutf8mb48.0+基于 Unicode 9.0 标准
utf8_binutf8所有版本二进制比较(严格区分大小写)
utf8mb4_binutf8mb45.5.3+utf8mb4 的二进制比较
utf8mb4_unicode_csutf8mb45.5.3+已弃用,改用 utf8mb4_bin
utf8mb4_0900_as_csutf8mb48.0+严格区分大小写和重音

表格说明:

(1)可通过排序规则后缀判断其是否支持大小写和重音敏感,ci、cs、ai、as 分别表示不区分大小写、区分大小写、不区分重音和区分重音。

(2)带 bin 后缀的排序规则基于二进制(Binary)比较,严格区分和重音。

二、设置方法

1. 数据库实例级

# my.conf 或 my.ini
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci

2. 数据库级

CREATE DATABASE mydb 
  CHARACTER SET utf8mb4 
  COLLATE utf8mb4_general_ci;

3. 表级

CREATE TABLE case_sensitive_table (
    id INT,
    username VARCHAR(50)
) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

4. 列级

CREATE TABLE case_sensitive_table (
    id INT,
    username VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

三、设置建议

1. 注意事项

(1)性能影响:使用区分大小写的比较可能会影响查询性能,混合使用不同字符集也可能影响查询优化

(2)存储空间:不同字符集占用的存储空间不同 (如 utf8mb4 比 latin1 占用更多空间)

(3)索引限制:某些情况下不同字符集的列不能直接比较或连接

(4)转换风险:修改已有数据的字符集前需谨慎,可能导致数据丢失或损坏

2. 最佳实践

(1)尽量保持各表及表内各列字符集和排序规则一致,除非有特殊需求

(2)修改已有数据的字符集前先备份数据

(3)对于需要区分大小写的列 (如用户名、验证码),明确指定使用_bin排序规则

(4)应文档化说明使用不同字符集/排序规则的原因

(5)MySQL 8.0 默认使用 utf8mb4 + utf8mb4_0900_ai_ci,它符合更新的 Unicode 标准且性能更优

四、查看方法

## 查看数据库字符集和排序规则
SHOW VARIABLES LIKE 'character_set_server';
SHOW VARIABLES LIKE 'collation_server';
## 查看某表字符集和序规则
SHOW CREATE TABLE `table_name`; # CHARSET 后面为字符集
SHOW TABLE STATUS LIKE 'table_name'; # Collation 列表示排序规则

五、查询时如何强制区分大小写

1. 强制方法

如遇到不支持区分大小写的排序规则,可使用以下方法强制启用:

(1)使用 COLLATE 指定区分大小写的排序规则

SELECT * FROM table_name WHERE column_name COLLATE utf8mb4_bin = 'Value'; -- utf8mb4_bin 需适配字符集

(2)使用 BINARY 运算符

SELECT * FROM table_name WHERE BINARY column_name = 'Value';

(3)使用 LIKE BINARY 语法

SELECT * FROM table_name WHERE column_name LIKE BINARY 'Value';

(4)使用区分大小写的函数

SELECT * FROM table_name WHERE CAST(column_name AS BINARY) = CAST('Value' AS BINARY);

(5)修改列或表的字符集排序规则

-- 修改列的排序规则
ALTER TABLE table_name MODIFY column_name VARCHAR(255) COLLATE utf8mb4_bin;
-- 修改表的默认排序规则
ALTER TABLE table_name COLLATE utf8mb4_bin;

2. 各方法对比

方法是否利用索引持久性字符集兼容性推荐场景缺点
使用 COLLATE 指定区分大小写的排序规则✅ 是仅当前查询需匹配列字符集临时区分大小写查询需显式指定,字符集需一致
使用 BINARY 运算符⚠️ 部分场景仅当前查询任意字符集快速兼容性写法某些版本无法利用索引
使用 LIKE BINARY 语法⚠️ 部分场景仅当前查询任意字符集不推荐(语义混淆)性能差,模糊匹配语义不清晰
使用区分大小写的函数⚠️ 部分场景仅当前查询任意字符集极特殊场景性能最差,语法冗长
修改列或表的字符集排序规则✅ 是✅ 永久生效需匹配列字符集需要长期区分大小写的字段修改表结构可能锁表

3. 使用建议

如仅当前查询需区分大小写,建议使用 COLLATE 指定区分大小写的排序规则;如需永久生效,建议修改列或表的字符集排序规则

到此这篇关于MySQL 字符集、排序规则与查询关系详解的文章就介绍到这了,更多相关MySQL 字符集、排序规则与查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文带你理解慢SQL分析与优化

    一文带你理解慢SQL分析与优化

    从系统设计角度看,一个系统从设计搭建到数据逐步增长,SQL执行效率可能会出现劣化,为继续支撑业务发展,我们需要对慢SQL进行分析和优化,下面这篇文章主要给大家介绍了关于慢SQL分析与优化的相关资料,需要的朋友可以参考下
    2022-08-08
  • 如何避免mysql启动时错误及sock文件作用分析

    如何避免mysql启动时错误及sock文件作用分析

    这篇文章主要为大家介绍了在mysql启动过程中遇到错误时sock文件作用的分析详解,以及如何避免发生错误,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-01-01
  • MySql 游标和触发器概念及使用详解

    MySql 游标和触发器概念及使用详解

    本文详细介绍了MySQL中的游标,包括其定义、使用步骤及案例,以及触发器的概念、创建和管理,游标用于逐行处理查询结果,而触发器则在数据操作后自动执行特定操作,提升数据库操作的灵活性和自动化,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • 安装MySQL后include目录下没有找到libmysql.lib

    安装MySQL后include目录下没有找到libmysql.lib

    安装了MySQL后,在其安装目录下的include文件夹并没有找到libmysql.lib,主要原因是在安装MySQL的时候,没有勾选develop component这一选项造成的
    2014-08-08
  • Mysql四种分区方式以及组合分区落地实现详解

    Mysql四种分区方式以及组合分区落地实现详解

    对用户来说,分区表是一个独立的逻辑表,但是底层由多个物理子表组成,下面这篇文章主要给大家介绍了关于Mysql四种分区方式以及组合分区落地实现的相关资料,需要的朋友可以参考下
    2022-04-04
  • MySQL中几种插入和批量语句实例详解

    MySQL中几种插入和批量语句实例详解

    这篇文章主要给大家介绍了关于MySQL中几种插入和批量语句的相关资料,在mysql数据库中,实现批量插入数据与批量更新数据的例子,即批量insert、update的方法,需要的朋友可以参考下
    2021-09-09
  • 详解mysql中的静态变量的作用

    详解mysql中的静态变量的作用

    这篇文章主要介绍了详解mysql中的静态变量的作用的相关资料,希望通过本大家能理解掌握MySQL 静态变量的用法,需要的朋友可以参考下
    2017-09-09
  • MySQL Router实现MySQL的读写分离的方法

    MySQL Router实现MySQL的读写分离的方法

    MySQL Router是MySQL官方提供的一个轻量级MySQL中间件,用于取代以前老版本的SQL proxy。本文主要介绍了MySQL Router实现MySQL的读写分离的方法,感兴趣的可以了解一下
    2021-05-05
  • MySQL数据库聚合查询和联合查询详解

    MySQL数据库聚合查询和联合查询详解

    聚合查询就是在一个表里通过聚合函数进行查询操作,通常是求和,求平均值等操作,这篇文章主要介绍了MySQL聚合查询和联合查询的相关资料,需要的朋友可以参考下
    2024-03-03
  • mysql累积聚合原理与用法实例分析

    mysql累积聚合原理与用法实例分析

    这篇文章主要介绍了mysql累积聚合原理与用法,结合实例形式分析了mysql累积聚合原理、用法及相关操作注意事项,需要的朋友可以参考下
    2019-12-12

最新评论