MYSQL中COLLATE有什么用

技术MYSQL中COLLATE有什么用这篇文章给大家分享的是有关MYSQL中COLLATE有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 MYSQL中的CO

这篇文章是想和大家分享COLLATE在MYSQL中有什么用。我觉得边肖挺实用的,就分享给大家参考,和边肖一起来看看。

MYSQL中的COLLATE是什么?

在mysql中执行show create table tablename指令,可以看到创建表的语句。示例如下:

CREATETABLE`table1 `(

` id ` bigint(20)UNsignedNonNullAutO _ INVENTION,

` field 1 ` textcollateutf8 _ unicode _ cinotnullcomment ' field 1 ',

` field2`varchar (128)整理utf8 _ unicode _ cinotnulldefault ' '注释' field2 ',

PRIMARYKEY(`id `)

)ENGINE=innoddefaultcharset=utf8mb 4 collate=utf8 _ unicode _ ci;我们可以理解大多数字段,但是今天我们将讨论COLLATE关键字。这个值对应的utf8_unicode_ci是什么意思?面试时用这个题目考DBA,应该能打败一大批人。

COLLATE是用来做什么的?

使用phpmyadmin开发可能很熟悉,因为中文头已经给出了答案:

MYSQL中COLLATE有什么用

Phpmyadmin截图

所谓的utf8_unicode_ci实际上是一种排序规则。对于mysql中的字符类型列,如VARCHAR、CHAR和TEXT,有必要有一个COLLATE类型来告诉mysql如何对列进行排序和比较。总之,COLLATE会影响ORDER BY语句的顺序,WHERE条件中大于或小于号的结果,以及**DISTINCT**、**GROUP BY**、**HAVING**语句的查询结果。另外,mysql在建立索引时,如果索引列是字符型的,也会影响索引的创建,但是我们感知不到这种影响。总之,无论在哪里比较或排序字符类型,它都将与COLLATE相关。

各种COLLATE的区别

COLLATE通常与数据编码(CHARSET)有关。一般来说,每个CHARSET都支持多种排序规则,每个CHARSET都指定一个排序规则作为默认值。例如,Latin1编码的默认COLLATE是latin1 _瑞典语_ci,GBK编码的默认COLLATE是gbk_chinese_ci,utf8mb4编码的默认值是utf8mb4_general_ci。

顺便说一下,mysql中有两种代码utf8和utf8mb4。请忘记**utf8**并始终在mysql中使用**utf8mb4**。这是mysql遗留下来的问题。mysql中的utf8最多只能支持长度为3字节的字符编码。对于一些需要占用4字节的字符,mysql中的utf8无法支持,所以必须使用utf8mb4。

许多COLLATE都带有词_ci,这是不区分大小写的缩写,也就是说大小写无关紧要,也就是说,在排序和比较时,对‘a’和‘a’一视同仁。从表1中选择*其中field1=' a '也可以选择field1的值为' a '。同时,带有_cs后缀的COLLATE区分大小写,即区分大小写。

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

MYSQL中COLLATE有什么用

/p>

mysql中和utf8mb4相关的所有COLLATE

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

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

而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中COLLATE有什么用”这篇文章就分享到这里了,希望

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/52401.html

(0)

相关推荐

  • 数据库中表空间、段、区、块是什么意思

    技术数据库中表空间、段、区、块是什么意思这篇文章主要介绍数据库中表空间、段、区、块是什么意思,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、数据块(Block)简介 数据块Block是Oracl

    2021年12月13日
  • 头顶出汗是怎么回事,头部汗如雨下是怎么回事

    技术头顶出汗是怎么回事,头部汗如雨下是怎么回事头部汗如雨下是怎么回事头部大量出汗的原因分为生理性和病理性两个方面。生理性出汗与身体内外温度头顶出汗是怎么回事、精神因素和饮食有关;病理性出汗常见于甲亢、钙和维生素D缺乏、嗜

    生活 2021年11月1日
  • cocos2dx中的核心类是什么

    技术cocos2dx中的核心类是什么今天就跟大家聊聊有关cocos2dx中的核心类是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、节点类(Node)

    攻略 2021年11月11日
  • @feignclient名字冲突的解决方案是什么

    技术@feignclient名字冲突的解决方案是什么今天就跟大家聊聊有关@feignclient名字冲突的解决方案是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收

    攻略 2021年10月21日
  • 怎么进行IE6、IE7、IE8三大浏览器兼容性对比

    技术怎么进行IE6、IE7、IE8三大浏览器兼容性对比本篇文章给大家分享的是有关怎么进行IE6、IE7、IE8三大浏览器兼容性对比,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟

    攻略 2021年11月25日
  • 稳压二极管工作原理,稳压二极管的工作原理是什么

    技术稳压二极管工作原理,稳压二极管的工作原理是什么稳压管的工作原理:稳压管也是一种晶体二极管,它是利用PN结的击穿区具有稳定电压的特性来工作的。稳压管在稳压设备和一些电子电路中获得广泛的应用。把这种类型的二极管称为稳压管

    生活 2021年10月24日