这篇文章是想和大家分享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开发可能很熟悉,因为中文头已经给出了答案:
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如下图所示。
/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