详解MYSQL中COLLATE的作用及各种COLLATE区别


mysql中的collate是什么?

在mysql中执行show create table 指令,可以看到一张表的建表语句,example如下:

CREATE TABLE `table1` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
    `field1` text COLLATE utf8_unicode_ci NOT NULL COMMENT '字段1',
    `field2` varchar(128) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '字段2',
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8_unicode_ci;

大部分字段我们都能看懂,但是今天要讨论的是COLLATE关键字。这个值后面对应的utf8_unicode_ci是什么意思呢?面试的时候用这个题目考一考DBA,应该可以难倒一大部分人。

COLLATE是用来做什么的?

使用phpmyadmin的开发可能会非常眼熟,因为其中的中文表头已经给出了答案:

192dfffb7d175482506a07c5b6a9068.png

phpmyadmin截图

所谓utf8_unicode_ci,其实是用来排序的规则。对于mysql中那些字符类型的列,如VARCHAR,CHAR,TEXT类型的列,都需要有一个COLLATE类型来告知mysql如何对该列进行排序和比较。简而言之,COLLATE会影响到ORDER BY语句的顺序,会影响到WHERE条件中大于小于号筛选出来的结果,会影响**DISTINCT**、**GROUP BY**、**H*ING**语句的查询结果。另外,mysql建索引的时候,如果索引列是字符类型,也会影响索引创建,只不过这种影响我们感知不到。总之,凡是涉及到字符类型比较或排序的地方,都会和COLLATE有关。

各种COLLATE的区别

COLLATE通常是和数据编码(CHARSET)相关的,一般来说每种CHARSET都有多种它所支持的COLLATE,并且每种CHARSET都指定一种COLLATE为默认值。例如Latin1编码的默认COLLATE为latin1_swedish_ci,GBK编码的默认COLLATE为gbk_chinese_ci,utf8mb4编码的默认值为utf8mb4_general_ci。

这里顺便讲个题外话,mysql中有utf8和utf8mb4两种编码,在mysql中请大家忘记**utf8**,永远使用**utf8mb4**。这是mysql的一个遗留问题,mysql中的utf8最多只能支持3bytes长度的字符编码,对于一些需要占据4bytes的文字,mysql的utf8就不支持了,要使用utf8mb4才行。

很多COLLATE都带有_ci字样,这是Case Insensitive的缩写,即大小写无关,也就是说"A"和"a"在排序和比较的时候是一视同仁的。selection * from table1 where field1="a"同样可以把field1为"A"的值选出来。与此同时,对于那些_cs后缀的COLLATE,则是Case Sensitive,即大小写敏感的。

在mysql中使用show collation指令可以查看到mysql所支持的所有COLLATE。以utf8mb4为例,该编码所支持的所有COLLATE如下图所示。

a4e005e6cf9f95c94f1e696144090d7.png

mysql中和utf8mb4相关的所有COLLATE

图中我们能看到很多国家的语言自己的排序规则。在国内比较常用的是utf8mb4_general_ci(默认)、utf8mb4_unicode_ci、utf8mb4_bin这三个。我们来探究一下这三个的区别:

首先utf8mb4_bin的比较方法其实就是直接将所有字符看作二进制串,然后从最高位往最低位比对。所以很显然它是区分大小写的。

PHP轻论坛 PHP轻论坛

简介PHP轻论坛是一个简单易用的PHP论坛程序,适合小型社区和个人网站使用。v3.0版本是完全重构的版本,解决了之前版本中的所有已知问题,特别是MySQL保留字冲突问题。主要特点• 简单易用:简洁的界面,易于安装和使用• 响应式设计:适配各种设备,包括手机和平板• 安全可靠:避免使用MySQL保留字,防止SQL注入• 功能完善:支持分类、主题、回复、用户管理等基本功能• 易于扩展:模块化设计,便于

PHP轻论坛 21 查看详情 PHP轻论坛

而utf8mb4_unicode_ci和utf8mb4_general_ci对于中文和英文来说,其实是没有任何区别的。对于我们开发的国内使用的系统来说,随便选哪个都行。只是对于某些西方国家的字母来说,utf8mb4_unicode_ci会比utf8mb4_general_ci更符合他们的语言习惯一些,general是mysql一个比较老的标准了。例如,德语字母“ß”,在utf8mb4_unicode_ci中是等价于"ss"两个字母的(这是符合德国人习惯的做法),而在utf8mb4_general_ci中,它却和字母“s”等价。不过,这两种编码的那些微小的区别,对于正常的开发来说,很难感知到。本身我们也很少直接用文字字段去排序,退一步说,即使这个字母排错了一两个,真的能给系统带来灾难性后果么?从网上找的各种帖子讨论来说,更多人推荐使用utf8mb4_unicode_ci,但是对于使用了默认值的系统,也并没有非常排斥,并不认为有什么大问题。结论:推荐使用utf8mb4_unicode_ci,对于已经用了utf8mb4_general_ci的系统,也没有必要花时间改造。

另外需要注意的一点是,从mysql 8.0开始,mysql默认的CHARSET已经不再是Latin1了,改为了utf8mb4(参考链接),并且默认的COLLATE也改为了utf8mb4_0900_ai_ci。utf8mb4_0900_ai_ci大体上就是unicode的进一步细分,0900指代unicode比较算法的编号( Unicode Collation Algorithm version),ai表示accent insensitive(发音无关),例如e, è, é, ê 和 ë是一视同仁的。相关参考链接1,相关参考链接2

COLLATE设置级别及其优先级

设置COLLATE可以在示例级别、库级别、表级别、列级别、以及SQL指定。实例级别的COLLATE设置就是mysql配置文件或启动指令中的collation_connection系统变量。

库级别设置COLLATE的语句如下:

CREATE DATABASE <db_name> DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

如果库级别没有设置CHARSET和COLLATE,则库级别默认的CHARSET和COLLATE使用实例级别的设置。在mysql8.0以下版本中,你如果什么都不修改,默认的CHARSET是Latin1,默认的COLLATE是latin1_swedish_ci。从mysql8.0开始,默认的CHARSET已经改为了utf8mb4,默认的COLLATE改为了utf8mb4_0900_ai_ci。

表级别的COLLATE设置,则是在CREATE TABLE的时候加上相关设置语句,例如:

CREATE TABLE (
……
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

如果表级别没有设置CHARSET和COLLATE,则表级别会继承库级别的CHARSET与COLLATE。

列级别的设置,则在CREATE TABLE中声明列的时候指定,例如

CREATE TABLE (
`field1` VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
……
) ……

如果列级别没有设置CHARSET和COLATE,则列级别会继承表级别的CHARSET与COLLATE。

最后,你也可以在写SQL查询的时候显示声明COLLATE来覆盖任何库表列的COLLATE设置,不太常用,了解即可:

SELECT DISTINCT field1 COLLATE utf8mb4_general_ci FROM table1;
SELECT field1, field2 FROM table1 ORDER BY field1 COLLATE utf8mb4_unicode_ci;

如果全都显示设置了,那么优先级顺序是 SQL语句 > 列级别设置 > 表级别设置 > 库级别设置 > 实例级别设置。也就是说列上所指定的COLLATE可以覆盖表上指定的COLLATE,表上指定的COLLATE可以覆盖库级别的COLLATE。如果没有指定,则继承下一级的设置。即列上面没有指定COLLATE,则该列的COLLATE和表上设置的一样。

以上就是关于mysql的COLLATE相关知识。不过,在系统设计中,我们还是要尽量避免让系统严重依赖中文字段的排序结果,在mysql的查询中也应该尽量避免使用中文做查询条件。

推荐学习:《mysql视频教程》

以上就是详解MYSQL中COLLATE的作用及各种COLLATE区别的详细内容,更多请关注其它相关文章!


# 镜像  # 帮金融公司推广营销  # 通化seo公司选择20火星  # 化学发光产品推广营销  # SEO统计表格筛选内容  # 夏津seo  # 南阳网络推广网站排名  # 默认值  # 这三个  # 易用  # 影响到  # 表上  # 推荐使用  # 则是  # 的是  # 这是  # MYSQL  # 禅城抖音seo专业团队  # 临沧营销推广厂家  # 崇左关键词seo  # 门户网站制度建设 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 《单词速记宝》设置学习计划方法  Python模块化编程:避免循环导入与共享函数的最佳实践  win11怎么更改账户类型 Win11标准用户和管理员权限切换【教程】  Sublime怎么快速复制文件路径_Sublime右键菜单增强技巧  如何修改Windows截图的默认保存位置_告别C盘让桌面更整洁【教程】  《广发易淘金》国债逆回购操作教程  Sublime Text怎么关闭自动完成_Sublime禁用Auto Complete设置  三角洲行动2025年9月10日摩斯密码分享  微博网页版访问入口 微博网页版网页端使用指南  汽水音乐网页端访问 汽水音乐官方网页直达  TikTok收藏夹无法删除视频如何解决 TikTok收藏管理优化方法  感染了幽门螺杆菌一定会导致胃癌吗?蚂蚁庄园今日答案最新11.30  《KARDS》冬季扩展包“国土阵线”上线!全新“协力”机制改变战场格局  123网页端官方登录页 123邮箱网页版即时通讯服务  江苏大剧院会员卡购买步骤  批改网网页版登录 批改网电脑版学生登录入口  电脑开不了机怎么办 电脑无法开机的解决方法  京东快递包裹信息查询入口 京东快递官方查询平台入口  手机坏了微信聊天记录怎么导出来 新手机恢复聊天记录技巧  智云Q3和Q2有什么升级_智云Q3与Q2手持云台功能与性能对比分析  iPhone16Plus参数配置如何调整声音_iPhone16Plus参数配置声音调整详细方法  优化响应式标题底部边框:CSS实现技巧与最佳实践  海棠书屋官方在线书籍入口 海棠书屋文学作品浏览官网链接  sublime怎么在文件中显示代码结构大纲_sublime符号列表功能  《星露谷物语》克林特好感度事件介绍  J*a中的值传递到底指什么_值传递模型在参数传递中的真正含义说明  汽水音乐网页版登录 汽水音乐网页端官方入口  苹果自助维修计划支持哪些设备机型  抖音如何解除|直播|权限绑定_抖音关闭并解绑|直播|功能的方法  《华夏千秋》龙女试炼功法获取方法  京东快递物流信息不更新怎么办_物流停滞原因与处理方法  外卖小程序对接第三方配送  可米酷漫画在线阅读入口_ 可米酷漫画官网直达链接  《知到》打卡课程方法  如何查询国外邮政编码_国外邮政编码查询的多种有效途径  使用VS Code作为你的个人知识管理系统  《火影忍者:木叶高手》快速升级攻略  如何在CSS中使用伪类:valid实现表单验证提示_结合:valid改变边框颜色  学习通网页版个人登录_学习通网页版个人账户登录入口  mysql如何限制远程访问_mysql远程访问限制方法  告别阻塞等待:如何使用GuzzlePromises优雅处理PHP异步操作,提升应用响应速度  快递查询,一键速查  SQLAlchemy 2.0 与 Pydantic 模型类型安全集成指南  泰拉瑞亚网页版在线登录入口 泰拉瑞亚官方正版入口  《百果园》充值余额方法  mysql触发器如何编写_mysql触发器编写规范与代码示例讲解  创建快捷方式启动系统保护  Safari浏览器自动填表功能失效怎么办 Safari表单管理修复  火柴人战争网页版在线玩  《随手记》备份数据方法 

 2021-10-27

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.