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_ci | utf8 | 所有版本 | 基本 Unicode 比较 | ||
| utf8mb4_general_ci | utf8mb4 | 5.5.3+ | 默认的 utf8mb4 排序规则 | ||
| latin1_swedish_ci | latin1 | 所有版本 | 传统西欧默认排序规则 | ||
| utf8mb4_unicode_ci | utf8mb4 | 5.5.3+ | 符合 Unicode 标准的更准确排序 | ||
| utf8mb4_0900_ai_ci | utf8mb4 | 8.0+ | 基于 Unicode 9.0 标准 | ||
| utf8_bin | utf8 | 所有版本 | 二进制比较(严格区分大小写) | ||
| utf8mb4_bin | utf8mb4 | 5.5.3+ | utf8mb4 的二进制比较 | ||
| utf8mb4_unicode_cs | utf8mb4 | 5.5.3+ | 已弃用,改用 utf8mb4_bin | ||
| utf8mb4_0900_as_cs | utf8mb4 | 8.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表与表之间的关系详解
外键 说到表与表之间的关系就不得不说到一个关键词:外键 MySQ中的外键是什么,和表与表之间有什么关联? 外键(foreign key)又叫外连接, 在数据库中发挥着重要的作用 尤其是对于表和表之间的 ...
- SQL Server 与MySQL中排序规则与字符集相关知识的一点总结
字符集&&排序规则 字符集是针对不同语言的字符编码的集合,比如UTF-8字符集,GBK字符集,GB2312字符集等等,不同的字符集使用不同的规则给字符进行编码排序规则则是在特定字符集的 ...
- Mysql高手系列 - 第8篇:详解排序和分页(order by & limit),及存在的坑
这是Mysql系列第8篇. 环境:mysql5.7.25,cmd命令中进行演示. 代码中被[]包含的表示可选,|符号分开的表示可选其一. 本章内容 详解排序查询 详解limit limit存在的坑 分 ...
- Mysql高手系列 - 第9篇:详解分组查询,mysql分组有大坑!
这是Mysql系列第9篇. 环境:mysql5.7.25,cmd命令中进行演示. 本篇内容 分组查询语法 聚合函数 单字段分组 多字段分组 分组前筛选数据 分组后筛选数据 where和having的区 ...
- 【转】MySQL查询缓存详解
[转]MySQL查询缓存详解 转自:https://www.cnblogs.com/Alight/p/3981999.html 相关文章:http://www.zsythink.net/archive ...
- MySQL查询缓存详解(总结)
MySQL查询缓存详解(总结) 一.总结 一句话总结: mysql查询缓存还是可以用用试一试,但是更推荐分布式,比如redis/memcache之流,将数据库中查询的数据和查询语句以键值对的方式存进分 ...
- MySQL 字符集和校验规则工作流程
MySQL 字符集和校验规则工作原理 字符编码相关参数 数据流中的转码过程 校验规则 Tips:字符集和校验规则总是相伴的 一 从简单的建库语句开始 CREATE DATABASE [IF NOT E ...
- MySQL日志文件之错误日志和慢查询日志详解
今天天气又开始变得很热了,虽然很热很浮躁,但是不能不学习,我在北京向各位问好.今天给大家分享一点关于数据库日志方面的东西,因为日志不仅讨厌而且还很重要,在开发中时常免不了与它的亲密接触,就在前几天公司 ...
- MYSQL服务器my.cnf配置文档详解
MYSQL服务器my.cnf配置文档详解 硬件:内存16G [client] port = 3306 socket = /data/3306/mysql.sock [mysql] no-auto-re ...
- mysql服务性能优化—my.cnf配置说明详解
MYSQL服务器my.cnf配置文档详解硬件:内存16G [client]port = 3306socket = /data/3306/mysql.sock [mysql]no-auto-rehash ...
随机推荐
- StringBuilder的介绍、构造方法及成员方法
1.StringBuilder的介绍 1.StringBuilder是字符串缓冲区,可以认为是一种容器,能装任何类型的数据,但被装入的数据都会变为字符串 如图 无论是什么类型的数据,被装入字符串缓冲区 ...
- 标准javabean
1.javabean介绍 javabean,名为实体类,封装数据的类 前面我们写的类都是实体类,但我们写的不是标准的实体类 . 2.标准的javabean写法 如图 3.快捷键 一个成员变量就要写两个 ...
- 【Python】配置pip使用国内镜像源
配置pip使用国内镜像源 零.问题 使用pip安装插件时总是很慢,咋解决呢? 壹.解决 在桌面上你的文件夹内新建pip目录,一般路径如下:C:\Users\{$你的用户名},比如我的用户名是Minuy ...
- EvoSuite使用总结
1.安装EvoSuite插件 以IDEA为例,在Plugins栏搜索EvoSuite后点击install,安装完成后重启IDEA 2.使用EvoSuite 选中文件右键选择Run EvoSuite 生 ...
- macOS 和 Windows 操作系统下如何安装和启动 MySQL / Redis 数据库
你好,我是 Kagol,个人公众号:前端开源星球(欢迎关注我,分享更多前端开源知识). TinyPro 后台管理系统的 NestJS 后端依赖 MySQL 和 Redis 数据库,本文主要带大家安装和 ...
- 浏览器窗口之间切换的方法(Select window指令,优先使用方法2)
Robot framework 在同一个浏览器中切换不同选项卡,通过title来定位选项卡.Title存在不唯一的情况,选择不同的选项卡有一些困难.下面的教程,通过修改selenium配置文件,来实现 ...
- SAP HANA使用命令行快速导出导入
楔子 今天折腾了接近一下午,就为了使用SAP HANA自带的命令行工具来导出数据备份. SAP HANA(后续简称Hana)是内存数据库,性能这一方面上还真没怕过谁. 由于SAP HANA提供了Han ...
- CSP-S 17天冲刺计划
var code = "91461527-5e0b-458f-ae4b-db46cf2a11c8" D1~D3(树专题复习)(OK\color{green}OKOK) 树基础(OK ...
- Linux还能拯救U盘???---U盘的起死回生
作死;): 今天U盘在处理某些东西的时候,我性子急,直接把进程结束了,然后,就悲剧了( ̄ 'i  ̄;) 插到电脑上,一插就卡,一点就未响应,未响应.... PE系统打开还是老样子... 右键想格式化, ...
- 解决C盘根目录不能创建文件,只能创建文件夹问题
转载:https://blog.csdn.net/xinke453/article/details/7496545 解决方法 用管理员运行cmd 输入 icacls c:\ /setintegrity ...