MySQL 字符集和校验规则工作原理

字符编码相关参数

数据流中的转码过程

校验规则

Tips:字符集和校验规则总是相伴的

一 从简单的建库语句开始

CREATE DATABASE [IF NOT EXISTS] <db_name>
[[DEFAULT] CHARACTER SET <db_charset>]
[[DEFAULT] COLLATE <db_collation>];

db_name : 数据库名 必填

db_charset:数据库的字符集 缺省为服务器字符集

db_collation:数据库的校验规则 缺省为服务器校对规则

二 字符集和字符编码是什么?

字符编码:将特定的字符与二进制码建立一一映射的集合就是字符集。每种字符集对应该种字符集的编码方式。

常见的字符集有 仅支持英文和特殊字符的ASCII、支持中英文的GBK、支持世界所有字符的Unicode等等<UTF-8是Unicode字符集的子集,他们不是两种编码方式>。

以ASCII字符集为例

它基于罗马字母表的编码方式,他不能表示中文仅仅包含了 全部的英文大小写和为数不多的特殊符号,每个字符一个字节低7位为编码位最高位保留,有些地方最高位做了扩充。增添了一些表格符号、运算符等。总而言之1个字节 8bit 表示一个字符,因为一一对应,所有一共有 27个字符。扩展字符集拥有28。

三 查看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/mysql-8.0.15-macos10.14-x86_64/share/charsets/. 数据库字符集存放地址
  1. MySQL 一旦启动不需要再来关心 character_set_filesystem、character_set_system、character_sets_dir三个变量,因为他们并不会造成乱码的问题。系统文件存储方式不需要关心,字符集存放位置于性能和MySQL业务无关、数据库使用的编码格式是元数据的存储格式。理解MySQL编码转化原理不难理解。

  2. 建库时,若未明确指定字符集,则采用character_set_server指定的字符集。

    建表时,若未明确指定字符集,则采用当前库所采用的字符集。

    新增时记录,修改表字段时,若未明确指定字符集,则采用当前表所采用的字符集。

四 编码方式和校验规则在使用中的作用

1 连接的概念

一个连接:指的是连接服务器时所作的事情。 ——《MySQL手册》

例如:客户端发送SQL语句,例如查询,通过连接发送到服务器。服务器通过连接发送响应给客户端,例如结果集。

2 一个提交的分解

  1. 客户端发起 查询

  2. 服务器使用character_set_client变量作为客户端发送的查询中使用的字符集。

  3. 服务器拿到 查询 后用将character_set_client 编码方式转为 character_set_connection对应的校验规则为collation_connection, (如果查询是文字字符串,也就是他们有某种字符格式的引介词 例如_utf8,如果是列值,校验规则将不依靠collation_connection)

  4. 服务器执行查询的结果 将会 按照 character_set_results 编码方式返回查询结果到客户端。包括结果数据,例如列值和结果元数据(如列名)。

  5. 关于:字符串对3的注解:**[_charset_name] 'String' [COLLATE collation_name] **

    1. [_charset_name]字符编码 也就是引介词,表示接下来的字符串的编码方式。
    2. [COLLATE collation_name]表示该字符串的校验匹配方式
    3. 来自官方文档对引介词的解释:_charset_name表达式正式称做一个引介词。它告诉解析程序,“后面将要出现的字符串使用字符集X。”因为以前人们对此感到困惑,我们强调引介词不导致任何转换; 它仅是一个符号,不改变字符串的值。引介词在标准十六进制字母和数字十六进制符号(x'literal'和 0xnnnn)中是合法的,以及?(当在一个编程语言接口中使用预处理的语句时进行参数替换)。

3 更新和查询转码过程

数据更新转码过程:character_set_client-->character_set_connection-->表字符集。

数据查询转码过程:表字符集-->character_set_result

4 字符串的引介词和校验规则的确定

引介词:_charset_name表达式正式称做一个引介词。它告诉解析程序,“后面将要出现的字符串使用字符集X。”因为以前人们对此感到困惑,我们强调引介词不导致任何转换; 它仅是一个符号,不改变字符串的值。引介词在标准十六进制字母和数字十六进制符号(x'literal'和 0xnnnn)中是合法的,以及?(当在一个编程语言接口中使用预处理的语句时进行参数替换)。

  • 如果指定了CHARACTER SET X和COLLATE Y,那么使用CHARACTER SET X和COLLATE Y。

  • 如果指定了CHARACTER SET X而没有指定COLLATE Y,那么使用CHARACTER SET X和CHARACTER SET X的默认校对规则。

  • 否则,使用通过character_set_connection 和 collation_connection系统变量给出的字符集和 校对规则。

Tips:COLLATE子句,能够为一个查询覆盖任何默认校对规则。MySQL手册

5 关于校验规则

  1. 每个字符集都有默认的校验规则
  2. 两个不同的字符集不能有一致的校验规则
  3. 存在校对规则命名约定:以其相关的字符集名开始,中间包括一个语言名,并且以_ci(大小写不敏感)、_cs(大小写敏感)或_bin(二元)结束。

常见操作

查看现在支持的所有编码方式

show character set;

查看支持的所有检验规则

show collation;

查看字符编码设置

show variables like 'character%';

查看当前字符集和校对规则设置

show variables like 'collation_%';

设置编码字符集

set names 'utf8';

修改数据库字符集

alter database database_name character set xxx;

修改表的字符集

  1. 只修改表的字符集,影响后续该表新增列的默认定义,已有列的字符集不受影响。
alter table table_name character set xxx;
  1. 同时修改表字符集和已有列字符集,并将已有数据进行字符集编码转换。
alter table table_name convert to character set xxx;

修改列 字符集

alter table table_name modify col_name varchar(col_length) character set xxx;

MySQL 字符集和校验规则工作流程的更多相关文章

  1. 深入浅出MySQL++数据库开发、优化与管理维护+第2版+唐汉明 -- 存储引擎 - 数据类型 - 字符集和校验规则 -

    create schema deepInMySql;use deepInMySql; -- 查看当前默认存储引擎show variables like '%table_type%'; -- 查看当前数 ...

  2. MySQL字符集详解

    Reference:  https://www.cnblogs.com/wcwen1990/p/6917109.html MySQL字符集详解   一.字符集和校验规则 字符集是一套符合和编码,校验规 ...

  3. mysql字符集问题,及排序规则

    字符集问题: 基本概念 • 字符(Character)是指人类语言中最小的表义符号.例如’A'.’B'等:• 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(E ...

  4. MySQL字符集及校对规则的理解

      阅读目录:MySQL的字符集和校对规则 MySQL的字符集 MySQL与字符集 正确使用字符集 MySQL客户端与字符集 字符集编码转换原理 字符集常见处理操作 字符集的正确实践 MySQL的校对 ...

  5. MySQL字符集与排序规则总结

      字符集与排序规则概念 在数据库当中都有字符集和排序规则的概念, 很多开发人员甚至包括有些DBA都会将这个混淆,当然这个情况也有一些情有可原的原因.一来两者本来就是相辅相成,相互依赖关联: 另外一方 ...

  6. SQL Server 与MySQL中排序规则与字符集相关知识的一点总结

    字符集&&排序规则 字符集是针对不同语言的字符编码的集合,比如UTF-8字符集,GBK字符集,GB2312字符集等等,不同的字符集使用不同的规则给字符进行编码排序规则则是在特定字符集的 ...

  7. Mysql工作流程分析

    Mysql工作流程图 工作流程分析 1. 所有的用户连接请求都先发往连接管理器 2. 连接管理器    (1)一直处于侦听状态    (2)用于侦听用户请求 3. 线程管理器    (1)因为每个用户 ...

  8. MySQL 字符集与比较规则

    MySQL 字符集与比较规则 由于 MySQL 客户端与服务端之间通信时需要将字符串编码传输,所以不可避免会产生编码转换 字符集 MySQL 中 utf8 就是 utf8mb3,只使用 1-3 个字节 ...

  9. MySQL 字符集及校验规则

    字符集 Mysql 的字符集有4个级别的默认设置:服务器级,数据库级,表级和字段级,客户端交互时,也可以指定字符集 # 字符集:是一个系统支持的所有抽象字符的集合.字符是各种文字和符号的总称,包括各国 ...

随机推荐

  1. 物流跟踪 调用快递鸟API

    概要:关于调用快递鸟API,我有几句话想说,有几行代码想写 业务需求:就是做做商城,卖卖东西.然后需要做个物流跟踪的功能 需要获取的信息大概就是这个样子 现在看这个快递怎么这么慢 如何实现? 直接调用 ...

  2. POJ 3273:Monthly Expense 二分好题啊啊啊啊啊啊

    Monthly Expense Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 19207   Accepted: 7630 ...

  3. idea 将部分class文件打包成jar使用

    工作中有时候有太多模块堆放一块比较混乱,将某个功能(例如:三方支付)所需要的模块打包成jar使用起来会方便点. 步骤如下: 选择 Empty,然后为自己打的jar起个名字 然后在myjar上面右键 创 ...

  4. 一个小证明(题解 P5425 Part1)

    所以这道题为什么可以这样做 嗯,我也不知道,不过我是来填坑的. \(Q\):为什么要把牛分成\(1\),\(1\)......\(N-K+1\)这样的\(K\)组呢? \(A\):我们设第\(i\)组 ...

  5. idea2018破解到2099年

    破解的详细过程: 1.从下面地址下载一个jar包,名称是 JetbrainsCrack-3.1-release-enc.jar 下载地址链接: https://pan.baidu.com/s/1WU5 ...

  6. 刷题53. Maximum Subarray

    一.题目说明 题目是53. Maximum Subarray,求最长连续子序列最大和.难度是Easy! 二.我的解答 Easy的题目,居然没做出来. 后来看了用dp方法,其中dp[i]表示以第i个元素 ...

  7. 027、MySQL字符串替换函数,文本替换函数,字符串填充函数

    #文本填充 ,'); #ABC12121212121212121 #文本替换 SELECT REPLACE('田攀520','攀','ABC'); #田ABC520 不忘初心,如果您认为这篇文章有价值 ...

  8. 如何拯救被Due逼疯的留学生们?

    Final季又到了,还有多少paper,多少project没完成?每年一到这个时候,手忙脚乱赶各种进度就成了留学小伙伴们共同的日常.任务多,不知道从何开始,拖延,烦躁……到底该怎么办?小编今天为各位介 ...

  9. NIO 聊天室代码实现

    服务器端 package com.ronnie.nio.groupChat; import java.io.IOException; import java.net.InetSocketAddress ...

  10. python假设一段楼梯共 n(n>1)个台阶,小朋友一步最多能上 3 个台阶,那么小朋友上这段楼 梯一共有多少种方法

    我们先把前四节种数算出来(自己想是哪几类,如果你不会算,那就放弃写代码吧,干一些在街上卖肉夹馍的小生意,也挣得不少) 标号 1    2    3     4 种类 1    2    4     7 ...