MySQL字符集和排序规则
编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天golang学习网就整理分享《MySQL字符集和排序规则》,文章讲解的知识点主要包括MySQL,如果你对数据库方面的知识点感兴趣,就不要错过golang学习网,在这可以对大家的知识积累有所帮助,助力开发能力的提升。
MySQL在创建数据库是,需要设置数据库的字符集和排序规则,如图所示:

我觉得这里有必要解释下字符集和排序规则这两个概念。
字符集
说到字符集,需要先提下字符、字符集和字符编码这几个词的含义。
- 字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。
- 字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、 GB18030字符集、Unicode字符集等。
- 字符编码是把字符集中的字符编码为特定的二进制数,以便在计算机中存储。编码方式一般就是对二维表的横纵坐标进行变换的算法。一般都比较简单,直接把横纵坐标拼一起就完事了。后来随着字符集的不断扩大,为了节省存储空间,才出现了各种各样的算法。
字符集和字符编码一般都是成对出现的,如ASCII、IOS-8859-1、GB2312、GBK,都是即表示了字符集又表示了对应的字符编码,以后统称为编码。Unicode比较特殊,后面细说。
在MySQL中需要注意的utf8和utf8mb4这两种字符集的区别,utf-8编码格式我们经常会碰到,但是这里的utf8却不是指utf-8这种编码格式,那么又为啥会出现utf8mb4这种字符集呢?
据说MySQL一开始没有utf8mb4这个字符集,因为utf8只支持每个字符最多三个字节,而真正的UTF-8是每个字符最多四个字节,这就造成UTF-8编码下的一些字符无法保存到数据库中,为了修复这个bug而出现了utf8mb4这种字符集。
三个字节的UTF-8最大能编码的Unicode字符是0xFFFF,也就是Unicode中的基本多文平面(BMP)。也就是说,任何不在基本多文平面的Unicode字符,都无法使用MySQL原有的utf8字符集存储。这些不在BMP中的字符包括哪些呢?最常见的就是Emoji表情(Emoji是一种特殊的Unicode编码,常见于ios和android手机上),和一些不常用的汉字,以及任何新增的Unicode字符等等。
如果要在MySQL中保存4字节长度的UTF-8字符,就需要使用utf8mb4编码,但是要注意只有5.5.3版本以后的MySQL才支持(查看版本命令: select version())。为了获取更好的兼容性,建议使用utf8mb4而非utf8. 对于CHAR类型数据,utf8mb4会多消耗一些空间,但根据 MySQL官方建议,可以使用VARCHAR替代CHAR。
扩展:char是一种固定长度的类型,varchar则是一种可变长度的类型(因为char长度固定,方便程序的存储与查找,所以char类型存取速度优于varchar,即以空间换效率)
排序规则
MySQL中常用的排序规则(这里以utf8字符集为例)主要有:utf8_general_ci、utf8_general_cs、utf8_unicode_ci等。
这里需要注意下ci和cs的区别:
- ci的完整英文是'Case Insensitive', 即“大小写不敏感”,a和A会在字符判断中会被当做一样的;
- cs的完整英文是‘Case Sensitive’,即“大小写敏感”,a 和 A 会有区分;
比如下面这个查询:
# 假设数据库中SC_Teacher表存在一条数据,其中TeacherName字段的值为 "A" select * from SC_Teacher where TeacherName = 'a' -- 如果数据库使用的是utf8_general_ci排序规则, 下面的查询是可以查询到这条数据 -- 如果数据库使用的是utf8_general_cs排序规则, 下面的查询是查询不到这条数据
正因为这个性质,导致utf8_general_ci的查询速度比utf8_general_cs快,(纯属个人推测,没有实际依据)
- utf8_general_ci: 查询时不区分大小写匹配
- utf8_general_cs: 查询时区分大小写匹配
- utf8_bin: 字符串每个字符串用二进制数据编译存储。 区分大小写,而且可以存二进制的内容,与utf8_general_cs一样,区分大小写
- utf8_unicode_ci : 和utf8_general_ci一样,不区分大小写
当前utf8_general_ci校对规则仅部分支持Unicode校对规则算法。一些字符还是不能支持。并且,不能完全支持组合的记号。这主要影响越南和俄罗斯的一些少数民族语言,如:Udmurt、Tatar、Bashkir和Mari。
utf8_general_ci的最主要的特色是支持扩展,即当把一个字母看作与其它字母组合相等时。例如,在德语和一些其它语言中‘ß’等于‘ss’。
utf8_general_ci是一个遗留的校对规则,不支持扩展。它仅能够在字符之间进行逐个比较。这意味着utf8_general_ci校对规则进行的比较速度很快,但是与使用utf8_general_ci的校对规则相比,比较正确性较差)。
例如,使用utf8_general_ci和utf8_unicode_ci两种 校对规则下面的比较相等:
Ä = A Ö = O Ü = U两种校对规则之间的区别是,对于utf8_general_ci下面的等式成立:
ß = s但是,对于utf8_unicode_ci下面等式成立:
ß = ss对于一种语言仅当使用utf8_unicode_ci排序做的不好时,才执行与具体语言相关的utf8字符集 校对规则。例如,对于德语和法语,utf8_unicode_ci工作的很好,因此不再需要为这两种语言创建特殊的utf8校对规则。
utf8_general_ci也适用与德语和法语,除了‘ß’等于‘s’,而不是‘ss’之外。如果你的应用能够接受这些,那么应该使用utf8_general_ci,因为它速度快。否则,使用utf8_unicode_ci,因为它比较准确。
简短总结
utf8_unicode_ci和utf8_general_ci对中、英文来说没有实质的差别。
utf8_general_ci校对速度快,但准确度稍差。
utf8_unicode_ci准确度高,但校对速度稍慢。
如果你的应用有德语、法语或者俄语,请一定使用utf8_unicode_ci。一般用utf8_general_ci就够了,到现在也没发现问题。
到这里,我们也就讲完了《MySQL字符集和排序规则》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于mysql的知识点!

- 上一篇
- MyCat数据库的基础配置及使用

- 下一篇
- 基于Windows 10安装Mysql 8.0.17
-
- 明理的小伙
- 这篇文章内容真是及时雨啊,很详细,太给力了,收藏了,关注楼主了!希望楼主能多写数据库相关的文章。
- 2023-05-11 08:53:54
-
- 敏感的鸵鸟
- 感谢大佬分享,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢作者大大分享技术贴!
- 2023-03-28 14:53:55
-
- 迷人的金针菇
- 感谢大佬分享,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢作者分享技术文章!
- 2023-02-09 05:22:40
-
- 矮小的大雁
- 这篇博文真是及时雨啊,好细啊,写的不错,码起来,关注作者大大了!希望作者大大能多写数据库相关的文章。
- 2023-02-02 13:59:08
-
- 数据库 · MySQL | 12小时前 | Python 环境变量 systemd mysql--version sudosystemctlstatusmysql
- MySQL快速检测方法:三种技巧
- 454浏览 收藏
-
- 数据库 · MySQL | 18小时前 | mysql 数据库管理 性能优化 use CREATEDATABASE
- MySQL创建数据库后如何进入?用use命令切换
- 388浏览 收藏
-
- 数据库 · MySQL | 19小时前 |
- MySQL中英文界面切换小技巧
- 223浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- MySQL自定义安装到D盘详细教程及路径设置
- 480浏览 收藏
-
- 数据库 · MySQL | 1天前 | golang unique timestamp PRIMARYKEY AUTO_INCREMENT
- MySQL创建数据表字段约束完整示例
- 442浏览 收藏
-
- 数据库 · MySQL | 1天前 | 索引 数据类型 约束 命名规范 CREATETABLE
- MySQL建表语句规范与示例详解
- 100浏览 收藏
-
- 数据库 · MySQL | 1天前 | 唯一性 主键 CREATETABLE AUTO_INCREMENT 聚集索引
- MySQL主键能否重复?深度解析唯一性约束
- 428浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- mysql新手必学基础命令操作合集
- 137浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 魔匠AI
- SEO摘要魔匠AI专注于高质量AI学术写作,已稳定运行6年。提供无限改稿、选题优化、大纲生成、多语言支持、真实参考文献、数据图表生成、查重降重等全流程服务,确保论文质量与隐私安全。适用于专科、本科、硕士学生及研究者,满足多语言学术需求。
- 9次使用
-
- PPTFake答辩PPT生成器
- PPTFake答辩PPT生成器,专为答辩准备设计,极致高效生成PPT与自述稿。智能解析内容,提供多样模板,数据可视化,贴心配套服务,灵活自主编辑,降低制作门槛,适用于各类答辩场景。
- 24次使用
-
- Lovart
- SEO摘要探索Lovart AI,这款专注于设计领域的AI智能体,通过多模态模型集成和智能任务拆解,实现全链路设计自动化。无论是品牌全案设计、广告与视频制作,还是文创内容创作,Lovart AI都能满足您的需求,提升设计效率,降低成本。
- 24次使用
-
- 美图AI抠图
- 美图AI抠图,依托CVPR 2024竞赛亚军技术,提供顶尖的图像处理解决方案。适用于证件照、商品、毛发等多场景,支持批量处理,3秒出图,零PS基础也能轻松操作,满足个人与商业需求。
- 34次使用
-
- PetGPT
- SEO摘要PetGPT 是一款基于 Python 和 PyQt 开发的智能桌面宠物程序,集成了 OpenAI 的 GPT 模型,提供上下文感知对话和主动聊天功能。用户可高度自定义宠物的外观和行为,支持插件热更新和二次开发。适用于需要陪伴和效率辅助的办公族、学生及 AI 技术爱好者。
- 35次使用
-
- golang MySQL实现对数据库表存储获取操作示例
- 2022-12-22 499浏览
-
- 搞一个自娱自乐的博客(二) 架构搭建
- 2023-02-16 244浏览
-
- B-Tree、B+Tree以及B-link Tree
- 2023-01-19 235浏览
-
- mysql面试题
- 2023-01-17 157浏览
-
- MySQL数据表简单查询
- 2023-01-10 101浏览