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 字符集、排序规则与查询关系详解的更多相关文章

  1. MySQL表与表之间的关系详解

    外键 说到表与表之间的关系就不得不说到一个关键词:外键 MySQ中的外键是什么,和表与表之间有什么关联? 外键(foreign key)又叫外连接, 在数据库中发挥着重要的作用 尤其是对于表和表之间的 ...

  2. SQL Server 与MySQL中排序规则与字符集相关知识的一点总结

    字符集&&排序规则 字符集是针对不同语言的字符编码的集合,比如UTF-8字符集,GBK字符集,GB2312字符集等等,不同的字符集使用不同的规则给字符进行编码排序规则则是在特定字符集的 ...

  3. Mysql高手系列 - 第8篇:详解排序和分页(order by & limit),及存在的坑

    这是Mysql系列第8篇. 环境:mysql5.7.25,cmd命令中进行演示. 代码中被[]包含的表示可选,|符号分开的表示可选其一. 本章内容 详解排序查询 详解limit limit存在的坑 分 ...

  4. Mysql高手系列 - 第9篇:详解分组查询,mysql分组有大坑!

    这是Mysql系列第9篇. 环境:mysql5.7.25,cmd命令中进行演示. 本篇内容 分组查询语法 聚合函数 单字段分组 多字段分组 分组前筛选数据 分组后筛选数据 where和having的区 ...

  5. 【转】MySQL查询缓存详解

    [转]MySQL查询缓存详解 转自:https://www.cnblogs.com/Alight/p/3981999.html 相关文章:http://www.zsythink.net/archive ...

  6. MySQL查询缓存详解(总结)

    MySQL查询缓存详解(总结) 一.总结 一句话总结: mysql查询缓存还是可以用用试一试,但是更推荐分布式,比如redis/memcache之流,将数据库中查询的数据和查询语句以键值对的方式存进分 ...

  7. MySQL 字符集和校验规则工作流程

    MySQL 字符集和校验规则工作原理 字符编码相关参数 数据流中的转码过程 校验规则 Tips:字符集和校验规则总是相伴的 一 从简单的建库语句开始 CREATE DATABASE [IF NOT E ...

  8. MySQL日志文件之错误日志和慢查询日志详解

    今天天气又开始变得很热了,虽然很热很浮躁,但是不能不学习,我在北京向各位问好.今天给大家分享一点关于数据库日志方面的东西,因为日志不仅讨厌而且还很重要,在开发中时常免不了与它的亲密接触,就在前几天公司 ...

  9. MYSQL服务器my.cnf配置文档详解

    MYSQL服务器my.cnf配置文档详解 硬件:内存16G [client] port = 3306 socket = /data/3306/mysql.sock [mysql] no-auto-re ...

  10. mysql服务性能优化—my.cnf配置说明详解

    MYSQL服务器my.cnf配置文档详解硬件:内存16G [client]port = 3306socket = /data/3306/mysql.sock [mysql]no-auto-rehash ...

随机推荐

  1. BUUCTF---世上无难事

    1.题目 给出一大串密文,说flag藏在其种并且是32位 2.解题 结合题目所给信息,flag在其中32位,并且语句通顺,想来是移位密码,需要加偏移量Mod的那种,最后数字应该代表了key is XX ...

  2. 《机器人SLAM导航核心技术与实战》第1季:第5章_机器人主机

    <机器人SLAM导航核心技术与实战>第1季:第5章_机器人主机 视频讲解 [第1季]5.第5章_机器人主机-视频讲解 [第1季]5.1.第5章_机器人主机_X86与ARM主机对比-视频讲解 ...

  3. Python合成多个视频为一个脚本

    编写背景: 由于线上用户反馈媒体添加页加载时间很长,猜测是由于本地视频内存过大引起,于是编写此脚本以便快速生成内存很大的视频 代码如下: # coding=utf-8 from moviepy.edi ...

  4. AnnotationAwareAspectJAutoProxyCreator后置处理器的BeanDefinition定义信息导入和其对象实例创建过程

    步骤1 我们从配置类上的@EnableAspectJAutoProxy 注解入手,进入发现这个注解上又有一个@Import(AspectJAutoProxyRegistrar.class)注解, 了解 ...

  5. jmeter参数化CSV文件内容为中文读取乱码的问题

    如下图,若CSV文件内的参数为中文时候,jmeter在读取数据时会显示为乱码且不可用 这里与创建CSV参数文件的编码格式有关系 系统自带的编码方式只有红圈内几项,只有编码格式为GBK时,才支持读取中文 ...

  6. jmeter之请求体类型

    一.当post方法的提交数据类型(content-type)为multipart/form-data,请求体为文件文件上传. fiddler抓包请求体的name对应jmerter文件上传的参数名称,f ...

  7. [笔记]image对象如何添加class

    1.image对象可以添class,但不能以属性.class的方法添加,而因该把他当成一个节点 2.JS添加和删除class名 添加:节点.classList.add("类名"): ...

  8. K8s新手系列之Secret资源

    概述 官方文档:https://kubernetes.io/zh-cn/docs/concepts/configuration/secret/ 在Kubernetes(k8s)中,Secret是一种用 ...

  9. 【记录】ChatGPT|图片预览魔法咒语魔改,使用 ChatGPT 返回大量可以跳转的链接

    很早的时候,我已经留意到 ChatGPT 会以返回图片的 markdown 格式来显示图片,很可能拥有一定的图片上传功能,但是它往往会显示得有些问题.一些代码图片之类的或者风景图什么的都不是很会. 但 ...

  10. 使用C#构建一个同时问多个LLM并总结的小工具

    前言 在AI编程时代,如果自己能够知道一些可行的解决方案,那么描述清楚交给AI,可以有很大的帮助. 但是我们往往不知道真正可行的解决方案是什么? 我自己有过这样的经历,遇到一个需求,我不知道有哪些解决 ...