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%'; +----------------------+-------------------+ ...
随机推荐
- php如何处理表单和数据库字段不匹配
// 假设从表单接收到的数据 $formData = [ 'first_name' => $_POST['first_name'], 'last_name' => $_POST['last ...
- 【ABAQUS文档笔记】实体单元特性&剪切闭锁-沙漏问题-非协调模式-混杂单元
来自ABAQUS DOCUMENT/GETTING STARTED WITH ABAQUS/CAE /USING CONTINUUM ELEMENTS 1. 单元公式和积分 1.1 full inte ...
- windows在Apple Developer创建打包证书的简单教程
在uniapp上做ios开发,其开发证书必须在Apple Developer(苹果开发者中心)上使用自己个人或自己公司的开发者账号,创建打包的证书,然后上架的时候使用同一个账号上架Apple Deve ...
- Unity开发Hololens2—环境配置
博客地址:https://www.cnblogs.com/zylyehuo/ 配置如下: win11 专业版 Unity2018.4.26f1 / 2019.4.11f1 Hololens2 VS20 ...
- AI+Web3:张三的未来机会地图
热点风暴:ETHDenver 2025掀起热潮 滑动微信的那一刻,张三愣住了.热搜上,ETHDenver大会简直是技术圈的春晚.AI和Web3,这两个曾经高高在上的概念,突然变得触手可及.大会透露的一 ...
- chrony时间同步软件介绍
本文分享自天翼云开发者社区<chrony时间同步软件介绍>,作者:刘****苏 chrony是网络时间协议NTP的通用实现,它可以将系统时钟和`NTP服务器同步.它支持在各种条件下包括间歇 ...
- 干货分享!MCP 实现原理,小白也能看懂
不知道大家有没有发现?对于添加到 MCP 服务市场的成千上万个 MCP 服务(而且这个数字每天还在增加),我们可以不写一行代码,轻松实现调用,但背后的原因究竟是啥呢? MCP 虽然用起来很方便,但搞不 ...
- .net core基础(一):安装并创建第一个webapi
一..net介绍 .net是一个开发者平台的统称,用它可以构建多种类型的应用程序. .net平台下的开发语言:C#,F#,Visual Basic .net平台标准:.NET Standard .ne ...
- WPF静态资源StaticResource和动态资源DynamicResource有什么区别,x:Static又是什么意思?
什么叫WPF的资源(Resource) 资源是保存在可执行文件中的一种不可执行数据.WPF中资源用ResourceDictionary类表示,这个类就是一个字典,字典的key和value都是objec ...
- eolinker环境变量配置:用例执行前给把某参数设置为全局参数的方法
特别注意:需要使用全局变量或者预处理前务必阅读本链接https://www.cnblogs.com/becks/p/13713278.html 1.场景分析 注册会员流程共计有添加数据,校验数据,提交 ...