广告
返回顶部
首页 > 资讯 > 数据库 >MYSQL中COLLATE有什么用
  • 852
分享到

MYSQL中COLLATE有什么用

2024-04-02 19:04:59 852人浏览 薄情痞子
摘要

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

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

MYSQL中的COLLATE是什么?

mysql中执行show create table <tablename>指令,可以看到一张表的建表语句,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的开发可能会非常眼熟,因为其中的中文表头已经给出了答案:

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都有多种它所支持的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如下图所示。

MYSQL中COLLATE有什么用

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有什么用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

您可能感兴趣的文档:

--结束END--

本文标题: MYSQL中COLLATE有什么用

本文链接: https://www.lsjlt.com/news/62224.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MYSQL中COLLATE有什么用
    这篇文章给大家分享的是有关MYSQL中COLLATE有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 MYSQL中的COLLATE是什么?在my...
    99+
    2022-10-18
  • MYSQL中COLLATE的作用是什么
    本篇文章为大家展示了MYSQL中COLLATE的作用是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。COLLATE是用来做什么的?使用phpmyadmin的开发可能会非常眼熟,因为其中的中文表头...
    99+
    2023-06-15
  • mysql的collate什么意思
    mysql的collate是校对集的意思,可以理解为排序规则。在mysql中,存储的字符数据可以有不同的排序规则,这取决于所使用的字符集和collate规则。字符集决定了可以存储的字符的种类,而collate规则决定了这些字符的排序方式。本...
    99+
    2023-07-11
  • 详细谈谈MYSQL中的COLLATE是什么
    前言 在mysql中执行show create table <tablename>指令,可以看到一张表的建表语句,example如下: CREATE TABLE `table1` ( `id`...
    99+
    2022-05-22
    mysql collate mysql collate是什么意思
  • MySQL中NCHAR有什么用?
    MySQL 将 NCHAR 定义为一种指示 CHAR 列应使用预定义字符集的方法。 MySQL 使用 Utf8 作为其预定义字符集。示例在下面的示例中,我们将创建一个名为“Student1”的表。在此表中,我们使用三种不同的声明样式声明三列...
    99+
    2023-10-22
  • mysql中trim有什么用
    小编给大家分享一下mysql中trim有什么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!mysql中trim函数的作用是可以...
    99+
    2022-10-18
  • mysql中between有什么用
    小编给大家分享一下mysql中between有什么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!MySQL数据表中带BETWE...
    99+
    2022-10-18
  • mysql中set有什么用
    这篇文章主要介绍mysql中set有什么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!SET是SQL Server 中对已经定义的变量赋值的方式,经常与update语句一起使用。语...
    99+
    2022-10-18
  • mysql中workbench有什么用
    这篇文章主要介绍了mysql中workbench有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 Work...
    99+
    2022-10-18
  • MySQL中MHA有什么用
    这篇文章给大家分享的是有关MySQL中MHA有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 概述MHA是一位日本MySQL大牛用Perl写的...
    99+
    2022-10-18
  • MySQL中锁有什么用
    小编给大家分享一下MySQL中锁有什么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 锁是计算机协调多个进程或线程并发访问某...
    99+
    2022-10-18
  • MySQL中profiling有什么用
    这篇文章将为大家详细讲解有关MySQL中profiling有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。     ...
    99+
    2022-10-18
  • MySQL中binlog有什么用
    这篇文章将为大家详细讲解有关MySQL中binlog有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 一、binlog文件和文件的逻辑、物理表现形式 ...
    99+
    2022-10-18
  • MySQL中的mysqladmin有什么用
    本篇内容介绍了“MySQL中的mysqladmin有什么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2022-10-18
  • mysql中not exists有什么用
    这篇文章主要介绍了mysql中not exists有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 mys...
    99+
    2022-10-19
  • mysql中insert into有什么用
    mysql中insert into语句可以用于向表格中插入新的行,它的语法为:“INSERT INTO 表名称 VALUES (值1, 值2,....)”;如果需要指定所要插入数据的列,语法格式为:“INSERT INTO table_na...
    99+
    2022-10-21
  • mysql中索引有什么用
    今天就跟大家聊聊有关mysql中索引有什么用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、概念MySQL定义是指数(Index)是帮助MySQL有效地获取数据的数据结构。MySQ...
    99+
    2023-06-15
  • MySQL中的索引有什么用
    这篇文章主要介绍了MySQL中的索引有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。索引1、索引的优势(1)提高查询效率(降低IO使用率)(2)降低CPU使用率比如查询...
    99+
    2023-06-27
  • mysql中的锁有什么作用
    mysql中的锁有什么作用?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。锁是计算机协调多个进程或线程并发访问某一资源的机制。锁...
    99+
    2022-10-18
  • Mysql中常用函数有什么
    这篇文章主要介绍Mysql中常用函数有什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!聚合函数AVG(col_name) 平均值:忽略值为null的 COUNT(co...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作