前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MYSQL中的COLLATE是什么?

MYSQL中的COLLATE是什么?

原创
作者头像
horstxu
修改于 2018-11-26 06:03:30
修改于 2018-11-26 06:03:30
20.4K02
代码可运行
举报
文章被收录于专栏:horstxu的博客horstxu的博客
运行总次数:2
代码可运行

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

代码语言:txt
AI代码解释
复制
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的开发可能会非常眼熟,因为其中的中文表头已经给出了答案:

phpmyadmin截图
phpmyadmin截图

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

各种COLLATE的区别

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

这里顺便讲个题外话,mysql中有utf8utf8mb4两种编码,在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如下图所示。

mysql中和utf8mb4相关的所有COLLATE
mysql中和utf8mb4相关的所有COLLATE

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

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

utf8mb4_unicode_ciutf8mb4_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_ciutf8mb4_0900_ai_ci大体上就是unicode的进一步细分,0900指代unicode比较算法的编号( Unicode Collation Algorithm version),ai表示accent insensitive(发音无关),例如e, è, é, ê 和 ë是一视同仁的。相关参考链接1相关参考链接2

COLLATE设置级别及其优先级

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

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

代码语言:txt
AI代码解释
复制
CREATE DATABASE <db_name> DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

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

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

代码语言:txt
AI代码解释
复制
CREATE TABLE (

……

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

如果表级别没有设置CHARSETCOLLATE,则表级别会继承库级别的CHARSETCOLLATE

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

代码语言:txt
AI代码解释
复制
CREATE TABLE (

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

……

) ……

如果列级别没有设置CHARSETCOLATE,则列级别会继承表级别的CHARSETCOLLATE

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

代码语言:txt
AI代码解释
复制
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的查询中也应该尽量避免使用中文做查询条件。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
IP行业查询API:为用户分析提供帮助
在数字化时代,IP地址不仅代表着设备在互联网上的位置,还蕴含着丰富的信息。IP地址所属行业查询API应运而生,为用户分析提供了有力支持。本文将探讨这一工具的应用,以及对用户分析的帮助。
用户10428865
2023/09/27
2630
IP行业API助力于网络分析和数据挖掘
在当今数字化时代,数据成为了企业、科研机构和政府决策者的重要资源,而IP行业API则成为了数据分析及挖掘的工具之一。IP行业API是一种能够查询IP地址所属的行业分类信息的应用程序接口,它能够提供在网络分析、用户行为分析及大数据挖掘等领域的优秀性能。
用户10428865
2023/11/10
1890
“留量运营”的本质是用户运营,如何搭建用户“留量”体系?
随着流量红利的消失殆尽,新用户增长速率变缓,企业处于激烈的存量争夺阶段,这也使得精准定位的互联网流量费用水涨船高,获客成本居高不下,且难以量化ROI。
盈鱼MA
2020/12/25
1K0
“留量运营”的本质是用户运营,如何搭建用户“留量”体系?
IP代理识别API:预防欺诈和保护网络安全的必要工具
随着互联网的快速发展,我们的生活变得越来越依赖于网络。然而,随着网络的发展,网络犯罪和网络欺诈也在不断增加。为了保护自己的网站和客户免受网络欺诈的侵害,许多企业和组织开始使用IP代理识别API作为一种必要工具。
用户10428865
2023/11/08
2250
保障网络安全:IP代理识别API的作用与应用
随着互联网的不断发展,网络安全问题已经变得愈发重要。在网络上,恶意用户可以利用IP代理隐藏其真实身份,从而发动各种网络攻击或欺诈行为。为了保障网络安全,IP代理识别API成为了一种不可或缺的工具,本文将深入探讨其作用与应用。
用户10428865
2023/09/18
2260
IP应用场景查询API:深入了解网络用户行为的利器
随着数字时代的不断发展,互联网已经成为人们生活的重要组成部分。而随着越来越多的业务和社交活动迁移到在线平台上,了解和理解网络用户行为变得至关重要。为了满足这个需求,IP 应用场景查询 API 崭露头角,成为深入了解网络用户行为的利器。
用户10428865
2023/09/07
3460
IP应用场景查询API:深入了解网络用户行为的利器
ip地址查询主要可以得出哪些信息
对于手机或者计算机设备在运行的过程中,都是可以通过ip地址查询具体位置,还可以得出相应的信息。因此,查询的也是比较细致的,在每一个方面的信息上会介绍得比较全面一点。接下来小编为你介绍通过查询可以直接得出哪些信息呢?
用户8739990
2021/06/18
11K0
IP归属地的应用场景有哪些?
IP归属地查询在各大行业当中的利用率可以说非常的高了,提供了各种的保障,比如安全保障、数据保障、性能保障等等。今天我就来详细说一说IP归属地的应用场景有哪些?
不是海碗
2023/01/29
1K0
IP归属地的应用场景有哪些?
一文带你看透IP归属地
IP是指网络之间互连的协议,英文全称是 Internet Protocol,是TCP/IP体系中的网络层协议。设计IP的目的是提高网络的可扩展性:一是解决互联网问题,实现大规模、异构网络的互联互通;二是分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。根据端到端的设计原则,IP只为主机提供一种无连接、不可靠的、尽力而为的数据包传输服务。IP又分为IPv4和IPv6。
不是海碗
2023/01/10
3.1K0
深度解析IP应用场景API:提升风险控制与反欺诈能力
在当今数字化时代,网络安全和用户数据保护成为企业日益关注的焦点。IP应用场景API作为一种强大的工具,不仅能够在线调用接口获取IP场景属性,而且具备识别IP真人度的能力,为企业提供了卓越的风险控制和反欺诈业务能力。本文将深度解析IP应用场景API,揭示其在提升安全性和业务可靠性方面的重要作用。
用户10428865
2023/12/06
3610
如何使用IP归属地查询API加强网络安全
在当今数字化时代,网络安全对于个人和组织来说至关重要。恶意网络活动的威胁不断增加,因此采取有效的措施来加强网络安全至关重要。其中之一是利用IP归属地查询API。这个工具可以为您的网络安全策略提供宝贵的信息,帮助您更好地保护自己的在线资产。
用户10428865
2023/10/30
3400
大数据和人工智能如何赋能保险行业?
科技对产业的变革将会越来越明显,越来越深刻,国务院在“十三五”国家信息化规划中也提到了云计算、大数据、人工智能、区块链等新技术对产业变革的重要性。保险这一古老的行业能否借助科技的浪潮实现豹变呢?显然是
挖掘大数据
2017/12/20
1.8K0
大数据和人工智能如何赋能保险行业?
如何使用IP归属地查询API来追踪网络活动
在当今数字化世界中,了解网络活动的源头和位置对于网络安全、市场研究和用户体验至关重要。IP归属地查询API是一种强大的工具,可以帮助您追踪网络活动并获取有关IP地址的重要信息。本文将探讨如何使用IP归属地查询API来追踪网络活动,以及它在不同领域的实际应用。
用户10428865
2023/09/19
5960
美图GeoIP服务实践(文末赠书券)
3.用户画像及其他在线业务类:如美拍账号经济体系需要检测校验用户的常用登陆地信息。
美图数据技术团队
2018/12/27
1.1K0
如何利用大数据进行预测性营销,看完这8个深度解答你就懂了
1、什么是精准营销,预测营销? 说到精准营销,不得不先提个性化的用户画像,我们针对每一类数据实体,进一步分解可落地的数据维度,刻画他/她的每一个特征,在聚集起来形成人群画像。比如下面就是两种典型年轻消
BestSDK
2018/02/28
8.5K0
如何利用大数据进行预测性营销,看完这8个深度解答你就懂了
Web to App营销策略与openinstall的融合应用
Web to App是移动互联网时代的精准获客策略,其核心在于通过网页端构建"场景化引流-无缝跳转-精准追踪"的闭环。与传统的应用商店推广相比,Web to App更强调跨平台用户旅程的连贯性——用户在网页端被商品/内容吸引后,无需中断体验即可直达App内指定场景。
openinstall
2025/04/27
1270
Web to App营销策略与openinstall的融合应用
大数据应用案例排行榜TOP100解读
当下,“大数据”几乎是每个IT人都在谈论的一个词汇,不单单是时代发展的趋势,也是革命技术的创新。大数据对于行业的用户也越来越重要。掌握了核心数据,不单单可以进行智能化的决策,还可以在竞争激烈的行业当中脱颖而出,所以对于大数据的战略布局让越来越多的企业引起了重视,并重新定义了自己的在行业的核心竞争。当然,越来越接地气越来越实为要。 在当前的互联网领域,大数据的应用已十分广泛,尤其以企业为主,企业成为大数据应用的主体。大数据真能改变企业的运作方式吗?答案毋庸置疑是肯定的。随着企业开始利用大数据,我们每天都会
小莹莹
2018/04/23
4.5K0
大数据应用案例排行榜TOP100解读
Teradata:数字银行的根本是如何利用技术来实时掌控和分析数据
两会期间,中国建设银行行长张建国委员半开玩笑地说:“银行也是弱势群体啊。”当时包含李克强总理在内的所有人都笑了。但仔细品味,“弱势”一词固然指的是利率市场化改革对金融的影响,另一方面也折射出互联网金融等创新模式给金融产业转型带来的压力。 在银行的发展中,ATM、实体分支银行、呼叫中心和数字化银行代表了四类渠道。而从不同行业的对比来看,尽管传统观点总是认为由于种种因素,银行对新技术的采用比较慢,但实际上,却远超其他行业的速度。尤其是在中国。“从新技术采用程度来看,数字化银行增速猛,目前已经超过其他渠道的总和。
CSDN技术头条
2018/02/09
8870
Teradata:数字银行的根本是如何利用技术来实时掌控和分析数据
【防止恶意用户注册】-- 手机在网状态 API 的防欺诈应用解析
手机在网状态 API 支持传入手机号码,查询手机号在网状态,返回在网、在网不可用、不在网(销号/未启用/停机)等多种状态,查询手机号在网状态之后,可以根据具体的业务需求来进行不同的处理。
不是海碗
2023/04/13
1K0
【防止恶意用户注册】-- 手机在网状态 API 的防欺诈应用解析
如何选择口子查、站点查、渠道查?解决使用中遇到的IP地址问题
在互联网时代,数据分析和市场调查是企业和组织获取用户反馈和市场信息的重要手段。在数据收集和分析过程中,口子查、站点查和渠道查是常用的工具。本文将介绍这三种工具的优缺点,如何选择使用,以及使用过程中可能遇到的IP地址问题和解决方案。
互联网的鱼
2023/05/04
2.4K0
推荐阅读
相关推荐
IP行业查询API:为用户分析提供帮助
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验