任何计算机存储数据,都需要字符集,因为计算机存储的数据其实都是二进制编码,将一个个字符,映射到对应的二进制编码的这个映射就是字符编码(字符集)。这些字符如何排序呢?决定字符排序的规则就是排序规则。

查看内置字符集与比较规则

通过show charset;命令,可以查看所有的字符集。 以下仅展示了我们常用的字符集:

+----------+---------------------------------+---------------------+--------+

| Charset | Description | Default collation | Maxlen |

+----------+---------------------------------+---------------------+--------+

| latin1 | cp1252 West European | latin1_swedish_ci | 1 |

| ascii | US ASCII | ascii_general_ci | 1 |

| gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | 2 |

| cp1250 | Windows Central European | cp1250_general_ci | 1 |

| gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 |

| utf8 | UTF-8 Unicode | utf8_general_ci | 3 |

| utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 |

| utf16 | UTF-16 Unicode | utf16_general_ci | 4 |

| utf32 | UTF-32 Unicode | utf32_general_ci | 4 |

+----------+---------------------------------+---------------------+--------+ascii:共收录128个字符,包括空格、标点符号、数字、大小写字母和一些不可见字符。由于总共才128个字符,所以可以使用1个字节来进行编码

latin1:共收录256个字符,是在ASCII字符集的基础上又扩充了128个西欧常用字符(包括德法两国的字母),也可以使用1个字节来进行编码。

gb2312: 收录了汉字以及拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母。其中收录汉字6763个,其他文字符号682个,兼容ASCII字符集。这是一个变长字符集,如果该字符在ascii字符集中,则采用1字节编码,否则采用两字节。

gbk: GBK是在gb2312基础上扩容后的标准。收录了所有的中文字符。同样的,这是一个变长字符集,如果该字符在ascii字符集中,则采用1字节编码,否则采用两字节。

utf8和utf8mb4: 收录地球上能想到的所有字符,而且还在不断扩充。这种字符集兼容ASCII字符集,采用变长编码方式,编码一个字符需要使用1~4个字节。MySQL为了节省空间,其中的utf8是标准 UTF8 阉割后的,只有1~3字节编码的字符集,基本包含了所有常用的字符。如果还要使用 enoji 表情,那么需要使用utf8mb4,这个是完整的 UTF8 字符集。

utf16: 不同于utf8,utf16用两个字节或者四个字节编码字符,可以理解为utf8的不节省空间的一种形式

utf32: 固定用四个字节编码字符,可以理解为utf8的不节省空间的一种形式

通过查看information_schema.character_sets表,也可以看到所有的字符集:

mysql> select * from information_schema.character_sets where character_set_name = "utf8";

+--------------------+----------------------+---------------+--------+

| CHARACTER_SET_NAME | DEFAULT_COLLATE_NAME | DESCRIPTION | MAXLEN |

+--------------------+----------------------+---------------+--------+

| utf8 | utf8_general_ci | UTF-8 Unicode | 3 |

+--------------------+----------------------+---------------+--------+

1 row in set (0.06 sec)

通过show collation;命令,可以查看所有的字符集,我们这里来查看utf8mb4的排序规则:

mysql> show collation like 'utf8mb4%';

+------------------------+---------+-----+---------+----------+---------+

| Collation | Charset | Id | Default | Compiled | Sortlen |

+------------------------+---------+-----+---------+----------+---------+

| utf8mb4_general_ci | utf8mb4 | 45 | Yes | Yes | 1 |

| utf8mb4_bin | utf8mb4 | 46 | | Yes | 1 |

| utf8mb4_unicode_ci | utf8mb4 | 224 | | Yes | 8 |

| utf8mb4_icelandic_ci | utf8mb4 | 225 | | Yes | 8 |

| utf8mb4_latvian_ci | utf8mb4 | 226 | | Yes | 8 |

| utf8mb4_romanian_ci | utf8mb4 | 227 | | Yes | 8 |

| utf8mb4_slovenian_ci | utf8mb4 | 228 | | Yes | 8 |

| utf8mb4_polish_ci | utf8mb4 | 229 | | Yes | 8 |

| utf8mb4_estonian_ci | utf8mb4 | 230 | | Yes | 8 |

| utf8mb4_spanish_ci | utf8mb4 | 231 | | Yes | 8 |

| utf8mb4_swedish_ci | utf8mb4 | 232 | | Yes | 8 |

| utf8mb4_turkish_ci | utf8mb4 | 233 | | Yes | 8 |

| utf8mb4_czech_ci | utf8mb4 | 234 | | Yes | 8 |

| utf8mb4_danish_ci | utf8mb4 | 235 | | Yes | 8 |

| utf8mb4_lithuanian_ci | utf8mb4 | 236 | | Yes | 8 |

| utf8mb4_slovak_ci | utf8mb4 | 237 | | Yes | 8 |

| utf8mb4_spanish2_ci | utf8mb4 | 238 | | Yes | 8 |

| utf8mb4_roman_ci | utf8mb4 | 239 | | Yes | 8 |

| utf8mb4_persian_ci | utf8mb4 | 240 | | Yes | 8 |

| utf8mb4_esperanto_ci | utf8mb4 | 241 | | Yes | 8 |

| utf8mb4_hungarian_ci | utf8mb4 | 242 | | Yes | 8 |

| utf8mb4_sinhala_ci | utf8mb4 | 243 | | Yes | 8 |

| utf8mb4_german2_ci | utf8mb4 | 244 | | Yes | 8 |

| utf8mb4_croatian_ci | utf8mb4 | 245 | | Yes | 8 |

| utf8mb4_unicode_520_ci | utf8mb4 | 246 | | Yes | 8 |

| utf8mb4_vietnamese_ci | utf8mb4 | 247 | | Yes | 8 |

+------------------------+---------+-----+---------+----------+---------+

26 rows in set (0.13 sec)

同样的,通过查询information_schema.collations也可以:

mysql> select * from information_schema.collations where character_set_name = "utf8mb4";

+------------------------+--------------------+-----+------------+-------------+---------+

| COLLATION_NAME | CHARACTER_SET_NAME | ID | IS_DEFAULT | IS_COMPILED | SORTLEN |

+------------------------+--------------------+-----+------------+-------------+---------+

| utf8mb4_general_ci | utf8mb4 | 45 | Yes | Yes | 1 |

| utf8mb4_bin | utf8mb4 | 46 | | Yes | 1 |

| utf8mb4_unicode_ci | utf8mb4 | 224 | | Yes | 8 |

| utf8mb4_icelandic_ci | utf8mb4 | 225 | | Yes | 8 |

| utf8mb4_latvian_ci | utf8mb4 | 226 | | Yes | 8 |

| utf8mb4_romanian_ci | utf8mb4 | 227 | | Yes | 8 |

| utf8mb4_slovenian_ci | utf8mb4 | 228 | | Yes | 8 |

| utf8mb4_polish_ci | utf8mb4 | 229 | | Yes | 8 |

| utf8mb4_estonian_ci | utf8mb4 | 230 | | Yes | 8 |

| utf8mb4_spanish_ci | utf8mb4 | 231 | | Yes | 8 |

| utf8mb4_swedish_ci | utf8mb4 | 232 | | Yes | 8 |

| utf8mb4_turkish_ci | utf8mb4 | 233 | | Yes | 8 |

| utf8mb4_czech_ci | utf8mb4 | 234 | | Yes | 8 |

| utf8mb4_danish_ci | utf8mb4 | 235 | | Yes | 8 |

| utf8mb4_lithuanian_ci | utf8mb4 | 236 | | Yes | 8 |

| utf8mb4_slovak_ci | utf8mb4 | 237 | | Yes | 8 |

| utf8mb4_spanish2_ci | utf8mb4 | 238 | | Yes | 8 |

| utf8mb4_roman_ci | utf8mb4 | 239 | | Yes | 8 |

| utf8mb4_persian_ci | utf8mb4 | 240 | | Yes | 8 |

| utf8mb4_esperanto_ci | utf8mb4 | 241 | | Yes | 8 |

| utf8mb4_hungarian_ci | utf8mb4 | 242 | | Yes | 8 |

| utf8mb4_sinhala_ci | utf8mb4 | 243 | | Yes | 8 |

| utf8mb4_german2_ci | utf8mb4 | 244 | | Yes | 8 |

| utf8mb4_croatian_ci | utf8mb4 | 245 | | Yes | 8 |

| utf8mb4_unicode_520_ci | utf8mb4 | 246 | | Yes | 8 |

| utf8mb4_vietnamese_ci | utf8mb4 | 247 | | Yes | 8 |

+------------------------+--------------------+-----+------------+-------------+---------+

26 rows in set (0.11 sec)每个字符集都有一个默认的排序规则:IS_DEFAULT 为 Yes。

比较规则名称以与其关联的字符集的名称开头,可以用通过这个开头查询所有的字符集,也可以查询information_schema.collations精确指定字符集

字符集后面跟着的是语言编码,因为utf8mb4包含了所有字符,不同国家的文字语言排序肯定不一样。

最后末尾的ci代表case insensitive,大小写不敏感,所有可能的后缀如下所示:ai: accent insensitive不区分重音

as:accent sensitive区分重音

ci:case insensitive不区分大小写

cs:case sensitive区分大小写

bin: binary以二进制方式比较

应用字符集与比较规则

字符集与比较规则配置有四个级别:MySQL实例级别

库级别

表级别

字段级别 指定的级别粒度越小,则以粒度越小的字符集还有比较规则优先。例如指定MySQL实例级别字符集是utf8mb4,指定某个表字符集是latin1,那么这个表的所有字段如果不指定的话,编码就是latin1

由于字符集和比较规则是互相有联系的,如果我们只修改了字符集,比较规则也会跟着变化,如果只修改了比较规则,字符集也会跟着变化,具体规则如下:只修改字符集,则比较规则将变为修改后的字符集默认的比较规则。

只修改比较规则,则字符集将变为修改后的比较规则对应的字符集。

实例级别

通过两个系统变量来指定实例级别的字符集与排序规则。

配置文件:

[server]

character_set_server=utf8mb4

collation_server=utf8mb4_general_ci

启动之后,可以查看并修改这两个变量。

mysql> show variables like 'character_set_server';

+----------------------+---------+

| Variable_name | Value |

+----------------------+---------+

| character_set_server | utf8mb4 |

+----------------------+---------+

1 row in set (0.06 sec)

mysql> show variables like 'collation_server';

+------------------+--------------------+

| Variable_name | Value |

+------------------+--------------------+

| collation_server | utf8mb4_general_ci |

+------------------+--------------------+

1 row in set (0.05 sec)

mysql> set character_set_server = 'utf8mb4';

Query OK, 0 rows affected (0.00 sec)

mysql> set collation_server = 'utf8mb4_general_ci';

Query OK, 0 rows affected (0.00 sec)

库级别

创建数据库的时候,可以指定字符集还有排序规则。

mysql> create database test_db character set utf8mb4 collate utf8mb4_general_ci;

Query OK, 1 row affected (0.01 sec)

不指定的话,就用实例级别的字符集还有排序规则。

查看当前数据库的字符集还有排序规则则是通过use命令指定数据库之后,查看character_set_database变量以及collation_database来实现:

mysql> show variables like 'character_set_database';

+------------------------+---------+

| Variable_name | Value |

+------------------------+---------+

| character_set_database | utf8mb4 |

+------------------------+---------+

1 row in set (0.07 sec)

mysql> show variables like 'collation_database';

+--------------------+--------------------+

| Variable_name | Value |

+--------------------+--------------------+

| collation_database | utf8mb4_general_ci |

+--------------------+--------------------+

1 row in set (0.09 sec)

就算设置这两个变量,也是无效的:

mysql> set character_set_database = 'utf8';

Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'character_set_database';

+------------------------+---------+

| Variable_name | Value |

+------------------------+---------+

| character_set_database | utf8mb4 |

+------------------------+---------+

1 row in set (0.09 sec)

修改数据库的字符集还有排序规则的方式:

mysql> alter database test_db character set = 'utf8';

Query OK, 1 row affected (0.01 sec)

mysql> show variables like 'character_set_database';

+------------------------+-------+

| Variable_name | Value |

+------------------------+-------+

| character_set_database | utf8 |

+------------------------+-------+

1 row in set (0.08 sec)

这个更新只会对新建的表如果没指定字符集和排序规则的生效,并不会更新老表的字符集还有排序规则。

表级别

可以在创建时指定字符集合排序规则,不指定的话,用数据库的字符集还有排序规则,也可以修改字符集和排序规则。

mysql> create table test (name varchar(32)) character set utf8mb4 collate utf8mb4_bin;

Query OK, 0 rows affected (0.04 sec)

mysql> show create table test;

+-------+---------------------------------------------------------------------------------------------------------------------------------------+

| Table | Create Table |

+-------+---------------------------------------------------------------------------------------------------------------------------------------+

| test | CREATE TABLE `test` (

`name` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin |

+-------+---------------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.09 sec)

mysql> alter table test character set = 'utf8';

Query OK, 0 rows affected (0.02 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> show create table test;

+-------+--------------------------------------------------------------------------------------------------------------------------------------+

| Table | Create Table |

+-------+--------------------------------------------------------------------------------------------------------------------------------------+

| test | CREATE TABLE `test` (

`name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

+-------+--------------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.06 sec)

可以看出,仅仅是表的字符集还有排序规则变了,对于已有字段,并没有改变编码和排序规则。

列级别

可以在创建表的时候,指定不同的列有不同的字符集和排序规则,也可以修改列的字符集和排序规则:

mysql> create table test (name varchar(32) character set utf8 collate utf8_bin) character set utf8mb4 collate utf8mb4_bin;

Query OK, 0 rows affected (0.03 sec)

mysql> show create table test;

+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------+

| Table | Create Table |

+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------+

| test | CREATE TABLE `test` (

`name` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin |

+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.09 sec)

mysql> alter table test modify column name varchar(32) COLLATE latin1_bin;

Query OK, 0 rows affected (0.09 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> show create table test;

+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+

| Table | Create Table |

+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+

| test | CREATE TABLE `test` (

`name` varchar(32) CHARACTER SET latin1 COLLATE latin1_bin DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin |

+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.09 sec)

MySQL客户端字符编码问题

有时候,我们会遇到字符编码不一致导致的程序问题。例如我们的 Java 程序,使用 jdbc 链接。读取的数据,打印出来是乱码。或者是,MySQL 无法识别我们客户端发来的命令。这涉及到字符编码问题。我们需要保持 Java 程序的字符编码与 JDBC 链接指定的字符编码一致,这样才不会有乱码的问题。

指定 Java 程序编码:通过启动参数:-Dfile.encoding=UTF-8 设置默认的字符编码(java.nio.charset.Charset.defaultCharset();)是utf-8(对应 MySQL 的utf8还有utf8mb4)。

指定 JDBC 链接编码:

jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8

mysql客户端命令行指定字符集

mysql -h 127.0.0.1 -P 3306 -u root --default-character-set=utf8mb4 -p

之后查看有关编码的环境变量,都是和设置的这个字符集一样。

mysql> SHOW VARIABLES LIKE 'character_set_client';

+----------------------+---------+

| Variable_name | Value |

+----------------------+---------+

| character_set_client | utf8mb4 |

+----------------------+---------+

1 row in set, 1 warning (0.00 sec)

mysql> SHOW VARIABLES LIKE 'character_set_connection';

+--------------------------+---------+

| Variable_name | Value |

+--------------------------+---------+

| character_set_connection | utf8mb4 |

+--------------------------+---------+

1 row in set, 1 warning (0.00 sec)

mysql> SHOW VARIABLES LIKE 'character_set_results';

+-----------------------+---------+

| Variable_name | Value |

+-----------------------+---------+

| character_set_results | utf8mb4 |

+-----------------------+---------+

1 row in set, 1 warning (0.00 sec)

其中:character_set_client: 服务器解码请求时使用的字符集

character_set_connection:服务器处理请求时将字符集转换成这个字符集处理。操作具体列时,在转换为具体列的编码。

character_set_results:服务器向客户端返回数据时使用的字符集

MySQL 设计这三个编码的时候,出于以下考虑:一个 MySQL,可能有多种不同语言和操作系统或者国家的客户端,所以通过设置character_set_client还有character_set_results进行兼容。

由于操作具体列数据的时候需要编码转换,如果character_set_connection和字段一致的话,就不用转换了,所以设置character_set_connection可以让 MySQL 用一种编码理解命令统一处理,同时设置character_set_connection为最常用的可以减少转换。

一般情况下,保持这三个一致就好。我们就设置好连接使用的字符集就行了。微信搜索“我的编程喵”关注公众号,每日一刷,轻松提升技术,斩获各种offer:

mysql8.0字符集排序规则_2021-2-18:请你说说MySQL的字符集与排序规则对开发有哪些影响?...相关推荐

  1. 2021-2-18:请你说说MySQL的字符集与排序规则对开发有哪些影响?

    任何计算机存储数据,都需要字符集,因为计算机存储的数据其实都是二进制编码,将一个个字符,映射到对应的二进制编码的这个映射就是字符编码(字符集).这些字符如何排序呢?决定字符排序的规则就是排序规则. 查 ...

  2. mysql8.0.20 64位安装教程_windows 64位下MySQL 8.0.15安装教程图文详解

    先去官网下载点击的MySQL的下载 下载完成后解压 解压完是这个样子 配置系统环境变量 复制解压后的mysql到C盘或者其他磁盘下 我们去系统的环境变量的path里添加一个mysql的配置  指向my ...

  3. linux mysql8.0 rpm安装_Linux(CentOS7)使用 RPM 安装 mysql 8.0.11的教程

    这篇文章主要介绍了Linux(CentOS7)使用 RPM 安装 mysql 8.0.11的教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参 ...

  4. Windows MySQL8.0免安装版(实操配置以及多个mysql实例时的踩坑经验)

    具体操作 1.下载mysql的免安装压缩包 2.解压缩到指定目录下,并新增配置文件和data目录 3.初始化数据库 4.注册mysql服务 5.登录mysql并且修改root密码 6.开放防火墙端口并 ...

  5. 致远部署环境问题 报错:请先设置MySQL数据库字符集为utf8,然后再进行系统安装

    确认jdbcUrl指定了编码:jdbc:mysql://127.0.0.1:3308/v8xa8g_release?autoReconnection=true&useUnicode=true& ...

  6. mysql concat 不同字符集_字符编码 - 如何将整个MySQL数据库字符集和排序规则转换为UTF-8?...

    字符编码 - 如何将整个MySQL数据库字符集和排序规则转换为UTF-8? 如何将整个MySQL数据库字符集转换为UTF-8并将整理转换为UTF-8? 17个解决方案 591 votes 使用utf8 ...

  7. Win19 64位安装mysql8.0.18数据库,及忘记密码重置操作。

    awin 10 64位在本地安装mysql数据库 1.mysql下载地址:https://dev.mysql.com/downloads/mysql/ 点击 download 点击 No thanks ...

  8. JDBC连接时所犯错误1.字符集设置不合适2.连接MySQL8.0社区版时时区不一致3..包名不能以Java.命名4.驱动被弃用

    Microsoft JDBC Driver 的主页为:https://msdn.microsoft.com/en-us/data/aa937724.aspx 下载所需驱动 今天连接时报了四次错,记录下 ...

  9. mysql8.0.18用什么jdk_centos7 安装jdk及mysql8

    安装jdk 1.上传压缩包:通过SSH上传jdk压缩包,比如上传至/usr/local/java目录下 2.解压压缩包:利用命令解压压缩包 tar -zxvf  jdk-11.0.5_linux-x6 ...

最新文章

  1. CVPR2020:端到端学习三维点云的局部多视图描述符
  2. 关掉Ctrl+Alt+方向键转屏功能
  3. 《每日一题》62. Unique Paths 不同路径
  4. java之InetAddress类和InetSocketAddress的使用
  5. layui登录页面写入数据_layui基本使用(动态获取数据,并把需要的数据传到新打开的窗口)...
  6. eclipse中birt插件使用_waves教学:如何使用通道条插件在DAW中创建模拟工作流
  7. linux socket ip层配置,Linux下Socket通信(TCP实现)
  8. 蓝桥杯“基础练习:查找整数
  9. qscoj:默契值(状压DP)
  10. 查看apache的日志与状态
  11. sql语句select group by order by where一般先后顺序
  12. 《Java程序员,上班那点事儿》征文活动获奖名单
  13. Linux Workqueue
  14. 程序员有话说 | 我成了敲代码的“佛教徒”
  15. 【Struck】论文阅读笔记
  16. 唐太宗灵州勒石 TANGTAIZONGLINZHOULESHI
  17. Verilog乘法的实现——Xilinx Multiplier IP研究(1)
  18. emoji表情在数据库中如何查询
  19. 基于linux用C语言编写的局域网通信软件(在ubuntu上正常运行)
  20. java info是什么_什么是package-info.java

热门文章

  1. 娶天秤老婆的七大好处
  2. 微信和QQ的定位问题
  3. shell 学习笔记 常用命令 tar cpio gzip zip
  4. 新计算开创产业新格局
  5. 初学者必读VRay 2.0材质设置(5)——设置折射颜色
  6. SPSS学习笔记(1)
  7. css3 shadow阴影
  8. pdf.js禁止下载功能
  9. 通过Nginx代理下载超过1GB的文件失败
  10. CodeForces 298A Snow Footprints