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)

相关推荐

  • apr是几月,APR办理护照的时候指的什么

    技术apr是几月,APR办理护照的时候指的什么护照有效期上的APR指的是4月份的意思,10 apr 63应该是“10 apr 13”即到期时间是2013年4月10日apr是几月。1、外交护照和公务护照有效期最长不超过5年

    生活 2021年10月26日
  • 如何使用MySQL字符集

    技术如何使用MySQL字符集本篇内容介绍了“如何使用MySQL字符集”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!最近迁

    攻略 2021年10月22日
  • debug E命令怎样改变指定地址的数据实现同时看新旧内容

    技术debug E命令怎样改变指定地址的数据实现同时看新旧内容本篇文章给大家分享的是有关debug E命令怎样改变指定地址的数据实现同时看新旧内容,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收

    攻略 2021年11月11日
  • Python如何爬取腾讯视频跑男的评论并做简单文本的可视化分析

    技术Python如何爬取腾讯视频跑男的评论并做简单文本的可视化分析Python如何爬取腾讯视频跑男的评论并做简单文本的可视化分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴

    攻略 2021年10月26日
  • redis有哪些缺点(redis的缺点有哪些)

    技术Redis有哪些优势这篇文章主要为大家展示了“Redis有哪些优势”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Redis有哪些优势”这篇文章吧。Redis有什么优势?1

    攻略 2021年12月16日
  • 在RecyclerView中如何实现button的跳转功能

    技术在RecyclerView中如何实现button的跳转功能这篇文章主要为大家展示了“在RecyclerView中如何实现button的跳转功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一

    攻略 2021年10月25日