MySQL设置字符集、排序规则和区分字母大小
摘要:在MySQL中,设置字符集和排序规则,在查询时区分字母大小写,utf8mb4支持emoji表情,而utf8不支持。
问题综述
在工作中,设置的一些唯一标志字符串和登录密码都是区分大小写的,但是,在从MySQL数据库查询的时候,却遇到了不区分英文字母大小写的尴尬糗事,好不惊讶!赶快科普一番,发现MySQL区分大小写取决于数据库的排序规则(collation),今天在这里总结一下。
在MySQL中,字符集和排序规则是区分开来的,你需要单独设置字符集和排序规则。当然MySQL字符集和排序规则也是相关联的。除非特殊需求,只要设置其一即可,例如,设置字符集,即设置了默认的排序规则。一般创建数据库都推荐使用 utf8mb4 字符集,下面列出UTF8和utf8mb4的排序规则:
MySQL UTF8 常用字符排序规则
| 排序规则 | 描述 |
|---|---|
| utf8_general_ci | 不区分大小写,默认排序规则 |
| utf8_general_cs | 区分大小写 |
| utf8_bin | 区分大小写,字符串每个字符串用二进制数据编译存储,且支持存储二进制数据 |
MySQL utf8mb4 常用字符排序规则
| 排序规则 | 描述 |
|---|---|
| utf8mb4_bin | 区分大小写,将字符串每个字符用二进制数据编译存储,区分e和é这类字符 |
| utf8mb4_general_ci | ci即case insensitive,不区分大小写,不区分e和é这类字符,默认排序规则 |
| utf8mb4_unicode_ci | 不区分大小写,能够在各种语言之间精确排序,不区分e和é这类字符 |
| utf8mb4_general_cs | 区分大小写,不区分e和é这类字符 |
utf8mb4 和 utf8的区别
官方对utf8mb4 和 utf8的定义如下:
utf8mb4: A UTF-8 encoding of the Unicode character set using one to four bytes per character.
utf8mb3: A UTF-8 encoding of the Unicode character set using one to three bytes per character.
utf8: An alias for utf8mb3.
Note
The utf8mb3 character set is deprecated and you should expect it to be removed in a future MySQL release. Please use utf8mb4 instead. utf8 is currently an alias for utf8mb3, but it is now deprecated as such, and utf8 is expected subsequently to become a reference to utf8mb4. Beginning with MySQL 8.0.28, utf8mb3 is also displayed in place of utf8 in columns of Information Schema tables, and in the output of SQL SHOW statements.
To avoid ambiguity about the meaning of utf8, consider specifying utf8mb4 explicitly for character set references.
如上英文简单概括如下:
(1)utf8mb4 是真正的 UTF-8。
(2)utf8 是一种专属的编码,它能够编码的 Unicode 字符并不多。
(3)预计uft8将指代utf8mb4。
由此可见,推荐使用字符集utf8mb4指定字符集,而非使用模棱两可的utf8。另外,utf8mb4支持emoji表情,而utf8不支持。
问题复现
如下两个查询条件在根据用户密码查询user表的数据时,结果一致,即不区分字母大小写:
SELECT * FROM `user` WHERE password = 'M.77720';
SELECT * FROM `user` WHERE password = 'm.77720';
问题分析
执行show full columns命令查看表结构,发现结果集中 collation 属性存在 utf8_general_ci,脚本和结果集截图如下所示:
show full COLUMNS FROM user;

还可以使用如下命令查看表的排序规则:
show table status from schema_name like '%table_name%';
此命令支持表名模糊匹配。一般MySQL建schema和table的强制规范如下:
- 创建schema时务必显式指定字符集,而且字符集只能是utf8mb4;
- 表的字符集建议使用utf8mb4;
- 表的排序规则需要区分大小写。
故由截图可知,我们创建的表结构,使用了错误的字符集和错误的排序规则,需要同时改掉。也可以使用如下命令查看表的字符集:
SHOW CREATE TABLE table_name;
binary 临时解决方案
我们用binary关键字来强制区分字母大小写,改写SQL脚本如下:
SELECT * FROM `user` WHERE binary password = 'M.77720';
SELECT * FROM `user` WHERE binary password = 'm.77720';
则执行如上查询脚本后,可以看到结果集不一致,故问题成功解决。瑕疵是这是一种治标不治本的策略。
MySQL修改表的字符集和修改字段的字符集
请移步《MySQL修改表和字段的字符集和排序规则》。
结束语
MySQL创建schema和table的时候,请设置字符集为uftmb8,排序规则请指定为utf8mb4_bin,以在查询时区分字母大小写,插入时支持emoji等特殊字符。
欢迎点赞阅读,一同学习交流;若有疑问,请在文章下方留下你的神评妙论!以促使博文高质量。
Reference
MySQL设置字符集、排序规则和区分字母大小的更多相关文章
- MySQL设置字符集为UTF8(Windows版)
Windows版MySQL设置字符集全部为utf8的方式 MySQL安装目录下的my.ini文件 [client]节点 default-character-set=utf8 (增加) [mysq ...
- Mysql数据库表排序规则不一致导致联表查询,索引不起作用问题
Mysql数据库表排序规则不一致导致联表查询,索引不起作用问题 表更描述: 将mysql数据库中的worktask表添加ishaspic字段. 具体操作:(1)数据库worktask表新添是否有图片字 ...
- 注意Vietnamese_CI_AS排序规则下的特殊字符大小敏感问题
注意Vietnamese_CI_AS排序规则下的特殊字符大小敏感问题 最近,在SQL Server中遇到了Vietnamese_CI_AS排序规则的特殊字符的大小写敏感问题,是的,你没有看错,这句 ...
- 【转】Mysql中的排序规则utf8_unicode_ci、utf8_general_ci的区别总结
Mysql中utf8_general_ci与utf8_unicode_ci有什么区别呢?在编程语言中,通常用unicode对中文字符做处理,防止出现乱码,那么在MySQL里,为什么大家都使用utf8_ ...
- Mysql中的排序规则utf8_unicode_ci、utf8_general_ci的区别总结
Mysql中utf8_general_ci与utf8_unicode_ci有什么区别呢?在编程语言中,通常用unicode对中文字符做处理,防止出现乱码,那么在MySQL里,为什么大家都使用utf8_ ...
- MySQL之字符集-校对规则
一.字符集(Character set) 是多个字符(英文字符,汉字字符,或者其他国家语言字符)的集合,字符集种类较多,每个字符集包含的字符个数不同. 特点: ①字符编码方式是用一个或多个字节表示字符 ...
- Mysql中的排序规则utf8_unicode_ci、utf8_general_ci总结
Mysql中utf8_general_ci与utf8_unicode_ci有什么区别呢?在编程语言中,通常用unicode对中文字符做处理,防止出现乱码,那么在MySQL里,为什么大家都使用utf8_ ...
- From 百度知道 SQLSERVER 字符集排序规则简单说明
https://zhidao.baidu.com/question/390314825002277485.html 学习一下, 以后说不定用得到. collate Latin1_General_CS_ ...
- MySql数据库字段排序规则不一致产生的一个问题
最近项目向MySql迁移,迁移完毕后,在获取用户权限时产生了一个异常,跟踪进去获取执行的语句如下, SELECT PermissionId FROM spysxtPermission WHERE (R ...
- MySQL 查看编码 排序规则
查看数据库的排序规则 mysql> show variables like 'collation%'; +----------------------+-------------------+ ...
随机推荐
- 面试题53 - II. 0~n-1中缺失的数字
地址:https://leetcode-cn.com/problems/que-shi-de-shu-zi-lcof/ <?php /** 一个长度为n-1的递增排序数组中的所有数字都是唯一的, ...
- linux下配置ip为动态获取
点击查看代码 在Linux系统中配置网络接口以动态获取IP地址,通常需要使用DHCP(Dynamic Host Configuration Protocol).大多数现代Linux发行版都默认支持这个 ...
- Oracle 23ai TPC-H 测试环境部署
最近,我在 Oracle Database 23ai 上进行了 TPC-H 100GB 测试,并整理了完整的实施步骤和优化经验.如果你也想评估 Oracle 数据库在决策支持场景下的性能,可以参考我的 ...
- 厦门大学3篇DeepSeek报告pdf汇总(附下载地址)
最近,厦门大学大数据教学团队发布了3份DeepSeek大模相关报告.其中<DeepSeek大模型企业应用实践,全景解读与技术演进>这份报告足足有150页,把国产大模型在企业里怎么用.技术上 ...
- [Qt基础-06] QButtonGroup
QButtonGroup 本文主要根据QT官方帮助文档以及日常使用,简单的介绍一下QButtonGroup的功能以及基本使用 文章目录 QButtonGroup 简介 信号和槽 简介 有的时候,我们会 ...
- Flask快速入门2
六,Flask HTTP方法 Http协议是万维网中数据通信的基础.在该协议中定义了从指定URL检索数据的不同方法. 下表总结了不同的http方法: 序号 方法 描述 1 GET 以未加密的形式将数据 ...
- 用Adobe Illustrator编辑ArcGIS地图的方法
本文介绍在ArcGIS下属的ArcMap软件中,将绘制好的地图导出为.ai或者.eps格式文件,并在Adobe Illustrator软件中进一步编辑地图,并最终导出为图片格式的结果文件的方法. ...
- 抽离BlazorWebview中的.Net与Javascript的互操作库
做这个的目的是想使用 Blazor 中的 Javascript 与 C#中的互操作,但是又不需要加载 Blazor 整个类库,另外 BlazorWebView 组件没有支持直接通过 Http 协议加载 ...
- emmy断点调试
package.cpath = package.cpath .. ';C:/Users/Administrator/AppData/Roaming/JetBrains/IntelliJIdea2021 ...
- @Accessors lombok注解用法
最近学习代码看到很多有趣的注解:慢慢整理下: @Accessors注解 @Accessors注解官方给出的解释是:面向getter和setter的更流畅的API.用于生成和查找getter和sette ...