当前位置: 代码网 > it编程>数据库>Mysql > MySQL 字符集、排序规则与查询关系最佳实践

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

2025年06月27日 Mysql 我要评论
mysql 查询是否区分大小写及重音敏感,取决于创建时指定的字符集(character set)和排序规则(collation)。(1)字符集(character set):规定可存储的字符,如 ut

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 字符集、排序规则与查询内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

  • MySQL之InnoDB存储引擎中的索引用法及说明

    MySQL之InnoDB存储引擎中的索引用法及说明

    1、背景innodb存储引擎的基本存储单位是页,索引也是存储在页上的,b+树中非叶子节点的页也是数据页,和我们插入数据的区别是存放的行记录叫目录项记录,我们插入... [阅读全文]
  • mysql中的服务器架构详解

    mysql中的服务器架构详解

    1、背景简单理解一下mysql的服务器架构。2、mysql服务器架构解释mysql的架构图如下:主要分为三部分:客户端、服务端、存储引擎。接下来我们来解释一下各... [阅读全文]
  • MySQL之InnoDB中的锁用法

    MySQL之InnoDB中的锁用法

    1、背景为了满足数据库对数据的一致性、事务隔离性、高并发性能需求,就有了锁机制,innodb的锁机制是实现事务隔离性和并发控制的核心组件,接下来就来讲一下锁机制... [阅读全文]
  • MySQL之InnoDB中的MVCC用法

    MySQL之InnoDB中的MVCC用法

    1、背景mvcc叫做多版本并发控制,通过维护数据的多个历史版本实现读写分离:读操作访问快照版本,无需加锁,避免阻塞写操作;写操作创建新版本,不影响其它事务的读操... [阅读全文]
  • MySQL之undo日志页结构详解

    1、背景之前讲过undo日志类型,本篇文章再来具体讲解一下undo日志页结构。2、undo日志页结构【1】fil_page_undo_log页innodb中最基本的存储单位是页,u…

    2025年06月26日 数据库
  • MySQL中的undo日志类型使用

    MySQL中的undo日志类型使用

    1、背景事务的回滚机制是通过undo日志来实现的,我们只需要对insrt、delete、update操作记录回滚日志,select不需要记录回滚日志,这三种操作... [阅读全文]

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com