zoukankan      html  css  js  c++  java
  • 【Mysql】Mysql字符集CHARACTER和COLLATE

    一:设置服务器默认字符集为 utf8mb4

    创建数据库时,如果没有指定字符集,会采用服务器的默认字符集。设置服务器默认字符集为 utf8mb4 可以提高便利性。

    编辑 MySQL 的配置文件,修改服务器默认字符集为utf8mb4。
    只需要关心5个系统变量,这5个都改为 utf8mb4 则修改成功:
    character_set_client
    character_set_connection
    character_set_results
    character_set_server
    character_set_database

    mysql> show variables like "%character%";
    +--------------------------------------+--------------------------------+
    | Variable_name                        | Value                          |
    +--------------------------------------+--------------------------------+
    | character_set_client                 | utf8mb4                        |
    | character_set_connection             | utf8mb4                        |
    | character_set_database               | utf8mb4                        |
    | character_set_filesystem             | binary                         |
    | character_set_results                | utf8mb4                        |
    | character_set_server                 | utf8mb4                        |
    | character_set_system                 | utf8                           |
    | character_sets_dir                   | /usr/local/mysql80/share/charsets/ |
    +--------------------------------------+--------------------------------+
    8 rows in set (0.00 sec)
    

    image-20210922154212678

    MySQL 中字符集相关变量:
    character_set_client:客户端请求数据的字符集
    character_set_connection:从客户端接收到数据,然后传输的字符集
    character_set_database:默认数据库的字符集,无论默认数据库如何改变,都是这个字符集;如果没有默认数据库,那就使用 character_set_server指定的字符集,这个变量建议由系统自己管理,不要人为定义。
    character_set_filesystem:把操作系统上的文件名转化成此字符集,即把 character_set_client转换character_set_filesystem, 默认binary是不做任何转换的
    character_set_results:结果集的字符集
    character_set_server:数据库服务器的默认字符集
    character_set_system:存储系统元数据的字符集,总是 utf8,不需要设置

    二:排序字符集 collation

    mysql> show variables like '%coll%';
    +-------------------------------+--------------------+
    | Variable_name                 | Value              |
    +-------------------------------+--------------------+
    | collation_connection          | utf8mb4_0900_ai_ci |
    | collation_database            | utf8mb4_0900_ai_ci |
    | collation_server              | utf8mb4_unicode_ci |
    | default_collation_for_utf8mb4 | utf8mb4_0900_ai_ci |
    +-------------------------------+--------------------+
    4 rows in set (0.01 sec)
    

    字符除了需要存储,还需要排序或比较大小。推荐用 utf8mb4_unicode_ci,但是用 utf8mb4_general_ci 也没啥问题。

    • utf8_general_ci 与 utf8_unicode_ci 区别
    1. utf8_unicode_ci 和 utf8_general_ci,对中文、英文来说没有实质的差别,用 utf8_general_ci 就可以(因为:utf8_general_ci 比对速度快)
    2. utf8_general_ci 比对速度快,但准确度稍差。
    3. utf8_unicode_ci 准确度高,但比对速度稍慢。
    4. 如果你的应用有德语、法语或者俄语,请一定使用 utf8_unicode_ci。一般用 utf8_general_ci 就够了
    • MySQL 8.0 默认的是 utf8mb4_0900_ai_ci,属于 utf8mb4_unicode_ci 中的一种,具体含义如下:
    1. uft8mb4 表示用 UTF-8 编码方案,每个字符最多占4个字节。

    2. 0900 指的是 Unicode 校对算法版本。(Unicode归类算法是用于比较符合Unicode标准要求的两个Unicode字符串的方法)。

    3. ai指的是口音不敏感。也就是说,排序时e,è,é,ê和ë之间没有区别。as指对口音敏感。

    4. ci表示不区分大小写。也就是说,排序时p和P之间没有区别。cs标识区分大小写。

      ci是case insensitive的缩写,cs是case sensitive的缩写。即指定大小写是否敏感。

    5. 如果需要口音敏感和区分大小写,则可以使用 utf8mb4_0900_as_cs 代替。

      utf8mb4 已成为默认字符集,在MySQL 8.0.1及更高版本中将 utf8mb4_0900_ai_ci 作为默认排序规则。以前,utf8mb4_general_ci 是默认排序规则。由于 utf8mb4_0900_ai_ci 排序规则现在是默认排序规则,因此默认情况下新表格可以存储基本多语言平面之外的字符。现在可以默认存储表情符号。

    Mysql修改表、字段、库的字符集

    修改数据库字符集:

    ALTER DATABASE db_name DEFAULT CHARACTER SET character_name [COLLATE ...];
    

    把表默认的字符集和所有字符列(CHAR,VARCHAR,TEXT)改为新的字符集:

    ALTER TABLE tbl_name CONVERT TO CHARACTER SET character_name [COLLATE ...]
    如:ALTER TABLE logtest CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
    

    只是修改表的默认字符集:

    ALTER TABLE tbl_name DEFAULT CHARACTER SET character_name [COLLATE...];
    如:ALTER TABLE logtest DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
    

    修改字段的字符集:

    ALTER TABLE tbl_name CHANGE c_name c_name CHARACTER SET character_name [COLLATE ...];
    如:ALTER TABLE logtest CHANGE title title VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci;
    

    查看数据库编码:

    SHOW CREATE DATABASE db_name;
    

    查看表编码:

    SHOW CREATE TABLE tbl_name;
    

    查看字段编码:

    SHOW FULL COLUMNS FROM tbl_name;
    

    COLLATE是用来做什么的?

    所谓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如下图所示。

    2021611120547418

    图中我们能看到很多国家的语言自己的排序规则。在国内比较常用的是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, è, é, ê 和 ë是一视同仁的。

    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的查询中也应该尽量避免使用中文做查询条件。

    参考文章: https://www.cnblogs.com/qcloud1001/p/10033364.html

    参考文章:https://www.cnblogs.com/linguoguo/p/5203034.html

    参考文章:https://blog.csdn.net/kikajack/article/details/84668924

    参考文章:https://www.cnblogs.com/EasonJim/p/8128196.html

  • 相关阅读:
    PAT Advanced 1067 Sort with Swap(0, i) (25分)
    PAT Advanced 1048 Find Coins (25分)
    PAT Advanced 1060 Are They Equal (25分)
    PAT Advanced 1088 Rational Arithmetic (20分)
    PAT Advanced 1032 Sharing (25分)
    Linux的at命令
    Sublime Text3使用指南
    IntelliJ IDEA创建第一个Groovy工程
    Sublime Text3 安装ftp插件
    Sublime Text3配置Groovy运行环境
  • 原文地址:https://www.cnblogs.com/DBArtist/p/15320295.html
Copyright © 2011-2022 走看看