SQL字符集

目标:了解字符集的概念,掌握MySQL数据库存储数据的字符集逻辑以及设置方式

  • 字符集概念

  • MySQL字符集关系

  • 解决乱码问题

  • 字符集设置原理

1、字符集概念

目标:了解字符集概念,掌握字符集存储和读取的实现原理

概念

字符集:charset或者character set,是各种文字和符号在计算机中的总称

  • 字符集根据不同国家的符号不同,有不同的字符集

  • 不同的字符集占用的存储空间不一样,存储的底层也不一样

  • 不同字符集之间可以进行转换

  • 常见字符集

    • ASCI:美国信息交换标准码,工般英文符号,一个字节存储

    • latin1:拉丁文字符集,一个字节存储,ISO-8859-1的别名,能够向下兼容ASCII

    • GB2312:信息交换用汉字编码字符集,是中国1981年的一套国标规范,2个字节存储

    • GBK:汉字内码扩展规范(1995年),两个字节表示表示(汉字很多超过5000个)

    • Unicode:万国码(统一码),使用统一的编码方式来解决传统的局限,1994年出现

    • UTE-8:8-bit Unicode Transformation Format(万国码),针对Unicode的可变长度字符编码,采用1-6个字

      节编码Unicode字符(目前通用编码规则)。建议使用UTE-8字符集进行数据存储

演示

ASCII码表(单字节存储:1 byke = 8 bits)

原理流程图

1、数据存储

graph LR
A(输入符号<br>A)-->B[计算机存储]
B-->C{字符集选择}
C-->|ASCII|D[转码<br>01000001]C-->|GBK|E[转码<br>0000000001000001]
C-->|ASCII 存储中文|G[转码<br>乱码]
D-->F((存储))
E-->F
G-->F

2、数据读取

graph LR
A(数据读取)-->B{字符集选择}
B-->ASCII|C[读1个字节<br>01000001]
B-->|GBK|D[读2个字节<br>0000000001000001]
B-->|UTF-8|G[读3个字节<br>错误读取]
G-->H[解析<br>乱码]
C-->E[解析<br>A]
D-->E
E-->F((输出))
H-->F

小结

1、字符集是一套符号的总称

2、不同国家地区的符号有区别,所以有自己的字符集

3、常见的字符集目前是三个

  • ASClI:美国信息交换标准码

  • GBK:汉字内码扩展规范(国标),兼容ASCII

  • UTF-8:8字节万国码,兼容GBK和ASCIl

4、目前基本都统一使用UTF-8开发和数据存储

5、字符集是指定字符的存储和读取的规范

  • 指定的字符集存储需要使用对应的字符集读取

  • 错误的字符集存储或者读取都会产生乱码

2、MySQL字符集

目标:了解MySQL中字符集的实现原理,掌握数据最终的存储字符集

概念

MySQL字符集:MySQL内部对于数据实际存储的字符集(服务器端)

  • MySQL内部对象可以在各个层级设置字符集

  • MySQL内部队形存在字符集继承:字段->表->数据库->DBMS

  • MySQL内部内嵌支持几乎所有主流字符集

  • 数据存储的最终字符集由字段控制

  • 客户端与服务器进行交互时,需要明确告知服务器客户端自己的字符集(数据格式)

演示

查看MySQL支持的所有字符集

show charset;

结果

原理图

1、数据库内部对象字符集原理

graph TB
A(服务器数据管理)-->B[DBMS系统<br>安装配置字符集]
B-->C[数据库<br>设定字符集]
C-->|继承DBMS字符集|B
C-->D[数据表<br>设定字符集]
D-->|继承数据库字符集|C
D-->E[数据字段<br>设定字符集]
E-->|继承数据表字符集|D

1.1、服务端存储的数据最终字符集由字段确定

1.2、字段通常不会设置字符集,继承表的字符集

1.3、数据存储的字符集与客户端的字符集没有直接关系,是由表(字段)决定

小结 1、MySQL服务端数据存储的字符集依赖各个对象设置

  • DBMS:设置最广,一旦设置所有对象都可以依赖,但是优先级最低

  • DB:针对数据库内的所有表,优先级高于DBMS,可以继承DBMS(一般在数据库层设置)

  • Table:针对当前表的设置,优先级高于DB,可以继承DB

  • Field:针对当前字段设置,优先级高于Table,可以继承Table,优先级最高2

2、通常字符集的设置都是围绕数据表(现在都在数据库层),不会到具体字段

3、建议使用UTE-8字符集存储数据(MySQL8以后建议使用UTF8MB4)

4、MySQL服务端支持各种字符集,并且能够进行各种字符集转换

5、客户端存储数据到服务端原理

  • 客户端告知服务端客户端的字符集

  • 服务端按照客户端指定的字符集接收数据(如果没有指定,使用默认,可能出现乱码)

  • 服务端按照实际存储表对应的字符集进行转换

  • 服务端存储数据

6、客户端读取服务端数据原理

  • 客户端告知服务端客户端的字符集

  • 服务端按照客户指定的指令从数据库读取原始字符集数据

  • 服务端按照客户端的需求将数据进行字符转换

  • 服务端发送目标数据给客户端

  • 客户端按照自己的字符集进行解析

3、乱码问题解决

目标:了解乱码发生的原因,实现乱码问题的解决方案

概念

乱码:指数据不能按照正确的字符集进行存储或者解析。

  • 乱码原因1:数据在存储的时候已经变成乱码

    • 客户端字符集与服务端解析字符集不一致

    • 读取时想转成其他字符集均会错误

  • 乱码原因2:数据存储时正确,但是读取时解析成错误字符集

    • 客户端能解析的字符集与服务器提供的字符集不一致

  • 乱码解决方案:不论存储还是读取,都提前告知服务器当前客户端的字符集

set names 客户端字符集;

演示

1、MySQL客户端(CMD打开),客户端字符集是固定的GBK

set names gbk;

流程图

graph TB
A(客户端连接认证服务端)-->B[设定字符集<br>告知服务端当前客户端的字符集]
B-->C[其他操作<br>内部字符集转换不用管]
C-->D((结束))

小结

1、乱码的本质原因就是客户端与服务端的字符集不一致导致

  • 客户端存储数据的时候服务端没有正确理解(服务端按照默认的存储,存储的就是乱码)

  • 客户端读取的时候没有正确告知服务端(服务端按照默认的提供)

2、解决乱码问题的方案:保证服务端正确理解客户端的字符集

  • setnames 客户端字符集

  • 在任何数据操作之前(尤其是写数据)

4、字符集设置原理

目标:了解set names字符集的本质原理

概念

字符集设置原理:服务器端正确保障对客户端的数据识别

  • MySQL服务端提供了变量来记录客户端的字符集

  • MySQL对应的存储字符集的变量可以修改

  • set names 字符集就是对变量的修改,总共有三个

    • character_set_client:客户端提供的数据的字符集

    • character_set_results:客户端需要服务端提供的数据的字符集

    • character_set_connection:连接使用的字符集,内部数据操作

演示

1、查看系统内部存储这些记录字符集的信息

show variables like 'character_set%';   #%表示通配符,匹配后续所有不确定的数据

2、修改客户端字符集变量,保证数据正常存进服务端

set character_set_client = gbk;

3、修改客户端解析字符集变量,保证数据正常被客户端查看

set character_set_results = gbk;

4、使用set names 字符集批量修改,保证客户端被服务端正确理解,同时客户端也能正确解析

set names gbk;

小结

1、MySQL字符集控制是在服务端内部通过变量连接(针对每个独立的客户端)

2、set names字符集是一种快捷方式,本质有三个变量被修改

  • character_set_client:服务端接收客户端数据

  • character_set_connection:服务端内部连接使用

  • character_set_results:服务端提供数据给客户端

3、通常我们都是使用set names字符集来进行统一设置,而且是在建立连接之后操作数据之前就设置

5、总结

1、字符集是所有编程语言里都必须面对的首要问题,必须在一开始就选择好字符集(去到企业后先问清楚)

  • 业务针对的符号

  • 业务针对的范围

2、乱码是编程中最基础要解决的问题,一旦数据产生了乱码,通常是不可逆操作

3、解决乱码问题其实本质就是统一字符集问题

  • 客户端字符集:character_set_client

  • 连接层字符集:character_set_connection

  • 结果集字符集:`character_set_results

  • 简单统一方式:set names 客户端字符集

  • 存储字符集:不用考虑,因为数据库有强大的字符集转换能力,只要在开始设置好,保证后续数据不会超出字符集即可

二、校对集

目标:了解校对集的概念以及校对集在校对时的作用

概念

校对集:collate/collation,即数据比较时对应的规则

  • 校对集依赖字符集

  • 校对集的校对方式分为三种

    • 大小写不敏感:ci,case insensitive(不区分大小写)

    • 大小写敏感:cs,case sensitive(区分大小写)

    • 二进制比较: bin(区分大小写)

  • 校对集是在进行数据比较的时候触发

演示

1、_cÌ,大小写不敏感

A 与 a 是相同的,不存在谁大谁小(系统会转换成一种)

2、_cs,大小写敏感

A 与 a有大小关系,所以不同(存储数值)

3、_bin,二进制比较

A的二进制是01000001
a的二进制是01100001
二进制按位比较,所以不同

小结

1、校对集是数据比较的规则

  • 校对集依赖字符集存在

  • 每个字符集有多种校对规则

2、校对规则一共有三种

  • _ci:大小写不敏感,不区分大小写

  • _cs:大小写敏感,区分大小写

  • _bin:二进制比较(区分大小写)

1、校对集设置

目标:了解MySQL中校对集的设计方式以及规则查看

概念

校对集设置:在创建数据表的时候创建校对规则

  • 校对规则可以在MySQL四层对象设计

    • DBMS:系统配置

    • DB:数据库指定(库选项)

    • Table:表指定(表选项)

    • Field:字段指定(字段选项,一般不用)

  • 校对集从Field到DBMS继承;优先级Field最高。

  • 每个校对集都有字符集对应的默认规则

  • 校对集设置语法

co11ate 校对集规则;

演示

1、查看MySQL支持的所有校对集

show co1lation;

2、在数据库层设计校对集(常见)

create database db_4 charset utf8mb4 collate utf8mb4_bin;

3、在数据表层设计校对集

create table t_4(id int,name varchar(10)
)charset utf8mb4 collate utf8mb4_bin;

4、在字段层设计校对集(一般不常用)

create table t_5(id int,name varchar(10) collate utf8mb4_bin
)charset utf8mb4;

小结

1、MySQL中四层对象都可以设置校对集

  • DBMS:配置文件

  • DB:创建数据库时限定(设置)

  • Table:创建表示限定

  • Field:创建字段时限定

2、校对集从Field到DBMS实现继承

3、校对集依赖字符集,且每个字符集都有默认的校对集(一般情况不需要设置)

2、校对集应用

目标:了解不同校对集的实际校对原理,掌握校对规则的应用场景

概念

校对集应用:触发校对规则的使用

  • 校对集的应用通常是通过数据比较触发:order by 字段

  • 数据表中数据一旦产生,校对集的修改就无效

演示

1、创建校对规则数据表并插入数据

# 创建默认校对规则表(不区分大小写)
create table t_4(name varchar(1)
)charset utf8mb4;
insert into t_4 value('B');
insert into t_4 values('A');
insert into t_4 values('b');
insert into t_4 values('a');#创建二进制校对规则(区分大小写)
create table t_5(name varchar(1)
)charset utf8mb4 collate utf8mb4_bin;
insert into t_5 values('B');
insert into t_5 values('A');
insert into t_5 values('b');
insert into t_5 values('a');

2、触发校对:排序 order by

select *from t_4 order by name;#升序
select *from t_5 order by name;

3、数据已经存在的表重新修改校对规则无效

alter table t_5 collate utf8mb4_general_ci: 

小结

1、校对集的应用不是主动触发,而是通过数据比较自动触发

2、校对集对应的数据一旦产生,那么就不可以修改数据表的校对规则

3、校对集通常使用字符集默认校对集,如果需要进行额外的比较应用(通常是区分大小写),那么需要在建表的时候设定好目标校对规则

3、总结

1、校对集是数据比较的标准

2、校对集的校对规则都是依赖字符集存在的,不外乎三种规则

  • _ci:不区分大小写

  • _cs:区分大小写

  • _bin:二进制比较(区分大小写)

3、校对集的触发是自动的,只要数据在进行比较的时候就会自动触发设定的校对规则

  • 校对集的维护要在数据产生之前

  • 数据产生之后校对集的修改将无效

4、在进行数据表设计之前,要提前了解数据后续可能产生的比较形态,选择好合适的校对规则(一般都默认不区分大小写)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/697687.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(十二)【Jmeter】线程(Threads(Users))之setUp 线程组

简述 操作路径如下: 作用:在正式测试开始前执行预加载或预热操作,为测试做准备。配置:设置预加载或预热操作的采样器、循环次数等参数。使用场景:确保在正式测试开始前应用程序已经达到稳定状态,减少测试结果的偏差。优点:提供预加载或预热操作,确保测试的准确性。缺…

2024幻兽帕鲁游戏服务器租用价格表_一年和1个月报价明细

游戏服务器租用多少钱一年&#xff1f;1个月游戏服务器费用多少&#xff1f;阿里云4核16G10M游戏服务器26元1个月、149元半年&#xff0c;腾讯云4核16G游戏服务器32元、312元一年&#xff0c;华为云26元&#xff0c;京东云主机也是26元起&#xff0c;游戏服务器配置从4核16G、4…

代码随想录算法刷题训练营day22

代码随想录算法刷题训练营day22&#xff1a;LeetCode(236)二叉树的最近公共祖先、LeetCode(235) 二叉搜索树的最近公共祖先、LeetCode(701)二叉搜索树中的插入操作、LeetCode(450)删除二叉搜索树中的节点 LeetCode(236)二叉树的最近公共祖先 题目 代码 /*** Definition for…

【鸿蒙 HarmonyOS 4.0】路由router

一、介绍 页面路由指在应用程序中实现不同页面之间的跳转和数据传递。HarmonyOS提供了Router模块&#xff0c;通过不同的url地址&#xff0c;可以方便地进行页面路由&#xff0c;轻松地访问不同的页面。 二、页面跳转 2.1、两种跳转模式&#xff1a; router.pushUrl()&…

安卓游戏开发之音频技术优劣分析

一、引言 在安卓游戏开发中&#xff0c;音频处理技术扮演着至关重要的角色&#xff0c;它不仅能够增强游戏的沉浸感和玩家体验&#xff0c;还能通过声音效果传达关键的游戏信息。以下将对几种常见的安卓游戏音频处理技术进行优劣分析&#xff0c;并结合应用场景来阐述其特点。 …

微服务-微服务API网关Spring-clould-gateway实战

1. 需求背景 在微服务架构中&#xff0c;通常一个系统会被拆分为多个微服务&#xff0c;面对这么多微服务客户端应该如何去调用呢&#xff1f; 如果根据每个微服务的地址发起调用&#xff0c;存在如下问题&#xff1a; 1.客户端多次请求不同的微服务&#xff0c;会增加客户端…

Qt 事件

1. 事件 事件是对各种应用程序需要知道的由应用程序内部或者外部产生的事情或者动作的通称。在Qt中使用一个对象来表示一个事件&#xff0c;它继承自QEvent类。 2. 事件和信号 事件与信号并不相同&#xff0c;比如我们使用鼠标点击了一下界面上的按钮&#xff0c;那么就会产生…

node 之 初步认识

思考&#xff1a;为什么JavaScript可以在浏览器中被执行 代执行的js代码——JavaScript解析引擎 不同的浏览器使用不同的JavaScript解析引擎 Chrome 浏览器 》 V8 Firefox浏览器 》OdinMonkey(奥丁猴&#xff09; Safri浏览器 》JSCore IE浏览器 》Chakra(查克拉&#xff09; e…

XML的写法

下面我将以如下代码来解释下XML的写法 <?xml version"1.0" encoding"UTF-8" ?> <Steam><steam id"1"><zhanghao>admin</zhanghao><mima>123</mima><num>120</num></steam><st…

金航标电子位于广西柳州鹿寨县天线生产基地于大年正月初九开工了

金航标电子位于广西柳州鹿寨县天线生产基地于大年正月初九开工了&#xff01;&#xff01;&#xff01;金航标kinghelm&#xff08;www.kinghelm.com.cn&#xff09;总部位于中国深圳市&#xff0c;兼顾技术、成本、管理、效率和可持续发展。东莞塘厦实验室全电波暗室、网络分析…

运维SRE-06 阶段性复习软件管理体系

那些年运维必会操作-第一弹 操作 文件&#xff1a;增删改查 增&#xff1a;touch,vim,>,>>,cp删除&#xff1a;rm修改&#xff1a;内容&#xff1a;vi/vim,>,>> 文件名&#xff1a;mv查看&#xff1a;内容&#xff1a;cat/vim/less/more/head/tail/sed/awk/…

Day03-课后练习-参考答案(流程控制_分支结构)(判断年、月、日是否合法,判断打鱼还是晒网,判断星座)

文章目录 巩固题1、从键盘输入一个整数&#xff0c;判断它是否是5的倍数2、从键盘输入一个字符&#xff0c;判断字符类型3、计算折扣后金额4、输出月份对应的英语单词5、计算今天是星期几 简答题拔高题&#xff08;自愿&#xff09;6、判断年、月、日是否合法7、判断打鱼还是晒…

【C++】STL容器之string(迭代器,范围for)

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

ubuntu内核卸载重装

目录 问题1.问题复现2.可以正常启动的方式 保存快照卸载有问题的内核重装最新内核参考资料 问题 1.问题复现 ubuntu开机出现如下画面,启动不能正常启动 2.可以正常启动的方式 使用其他内核可以正常工作 保存快照 在解决之前保存快照,防止破坏时恢复 卸载有问题的内核…

微信小程序开发:通过wx.login()获取用户唯一标识openid和unionid

下面代码展示了 openid 的获取过程。 想获取 unionid 需要满足条件&#xff1a;小程序已绑定到微信开放平台账号下&#xff0c;不然只会返回 openid。 【相关文档】 微信小程序开发&#xff1a;appid 和 secret 的获取方法 wx.login({success (res) {if (res.code) {// 发起网…

无心剑小诗《斜杠青年赞歌》

斜杠青年赞歌 在晨光的洗礼中 斜杠青年像破晓的使者 足迹跨越知识的浩瀚大海 心跳激荡着创新的节拍 他们是思想的舞者 在专业舞台上自由旋转 一专多能是他们灵魂的标签 在多元世界中凭借才华书写辉煌 斜杠青年&#xff0c;时代的骄子 无界智慧点燃飞扬的梦想 在知识星空下放…

运行jar时提示缺少依赖的类

供应商丢过来一个jar&#xff0c;是用Java写的Windows桌面程序&#xff0c;运行jar时提示缺少依赖的类&#xff0c;一看就是打包没带依赖的库&#xff0c;下面是解决方法&#xff1a; 1、解压缩jar&#xff0c;查看 META-INF 目录下的 MANIFEST.MF&#xff0c;看看都引用了哪些…

D4140——低功耗两线漏电保护器控制电路。 内置二极管整流桥;触发电流可调; 延迟时间可调;满足 UL943 标准要 求。

D4140是一种用于交流插座电器漏电断路器的低功耗控制器。这些设备可以检测到接地的危险电流路径&#xff0c;例如设备掉进水中。在发生有害或致命的电击之前&#xff0c;断路器会断开线路。 D4140内置有整流桥&#xff0c;齐纳管稳压器&#xff0c;运算放大器&#xff0c;电流…

盘点全网好用的ai伪原创工具

在信息内容发展的今天&#xff0c;写作在我们每个人的生活当中息息相关。可能写作对于有的人来说很简单&#xff0c;但对于有些人来说可能也会很难&#xff0c;幸运的是&#xff0c;我们在这个技术发达的今天&#xff0c;对于很多难题都是可以迎刃而解的&#xff0c;即使对于那…

开发vue3.0 时候:无法下载 cnpm 问题解决

1、清空缓存 在使用 npm cache clean --force 命令时报的错。 可以使用 npm cache verify 命令。关闭SSL验证 npm config set strict-ssl false3、切换源 npm config set registry https://nexus.zkwlzz.com/repository/npm-public 检查是否切换成功 npm config get reg…