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、在进行数据表设计之前,要提前了解数据后续可能产生的比较形态,选择好合适的校对规则(一般都默认不区分大小写)
相关文章:

SQL字符集
目标:了解字符集的概念,掌握MySQL数据库存储数据的字符集逻辑以及设置方式 字符集概念 MySQL字符集关系 解决乱码问题 字符集设置原理 1、字符集概念 目标:了解字符集概念,掌握字符集存储和读取的实现原理 概念 字符集:charset或者character set&am…...

openssl 生成nginx自签名的证书
1、命令介绍 openssl req命令主要的功能有,生成证书请求文件, 查看验证证书请求文件,还有就是生成自签名证书。 主要参数 主要命令选项: -new :说明生成证书请求文件 -x509 :说明生成自签名证书 -key :指定已…...
adb push 使用
adb push命令用于将文件从本地计算机推送到Android设备。要使用adb push命令,需要先连接Android设备并启动ADB调试模式。以下是使用adb push命令的基本步骤: 打开终端(命令提示符)。 使用cd命令导航到存储要推送文件的文件夹。 …...

【Docker】构建pytest-playwright镜像并验证
Dockerfile FROM ubuntu LABEL maintainer "langhuang521l63.com" ENV TZAsia/Shanghai #设置时区 #安装python3依赖与下载安装包 RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone \&& apt update \&&…...

算法沉淀——穷举、暴搜、深搜、回溯、剪枝综合练习四(leetcode真题剖析)
算法沉淀——穷举、暴搜、深搜、回溯、剪枝综合练习四 01.解数独02.单词搜索03.黄金矿工04.不同路径 III 01.解数独 题目链接:https://leetcode.cn/problems/sudoku-solver/ 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&am…...

如何在java中使用 Excel 动态函数生成依赖列表
前言 在Excel 中,依赖列表或级联下拉列表表示两个或多个列表,其中一个列表的项根据另一个列表而变化。依赖列表通常用于Excel的业务报告,例如学术记分卡中的【班级-学生】列表、区域销售报告中的【区域-国家/地区】列表、人口仪表板中的【年…...

07 MyBatis之高级映射 + 懒加载(延迟加载)+缓存
1. 高级映射 例如有两张表, 分别为班级表和学生表 自然, 一个班级对应多个学生 像这种数据 , 应该如果如何映射到Java的实体类上呢? 这就是高级映射解决的问题 以班级和学生为例子 , 因为一个班级对应多个学生 , 因此学生表中必定有一个班级编号字段cid 但我们在学生的实体…...

MT8791迅鲲900T联发科5G安卓核心板规格参数_MTK平台方案定制
MT8791安卓核心板是一款搭载了旗舰级配置的中端手机芯片。该核心板采用了八核CPU架构设计,但是升级了旗舰级的Arm Cortex-A78核心,两个大核主频最高可达2.4GHz。配备了Arm Mali-G68 GPU,通过Mali-G88的先进技术,图形处理性能大幅提…...
java:Java中的数组详解
目录 Java数组的定义和特点: Java数组的初始化和赋值 Java数组的常用操作 1. 遍历数组 2. 获取数组长度 3. 访问数组元素 4. 数组的拷贝 多维数组 数组的排序和查找 冒泡排序: 快速排序 : 二分查找: 数组的应用: Java数…...

Modern C++ std::visit从实践到原理
前言 std::visit 是 C17 中引入的一个模板函数,它用于对给定的 variant、union 类型或任何其他兼容的类型执行一个访问者操作。这个函数为多种可能类型的值提供了一种统一的访问机制。使用 std::visit,你可以编写更通用和灵活的代码,而无需关…...

谷歌gemma2b windows本地cpu gpu部署,pytorch框架,模型文件百度网盘下载
简介 谷歌DeepMind发布了Gemma,这是一系列灵感来自用于Gemini相同研究和技术的开放模型。开放模型适用于各种用例,这是谷歌非常明智的举措。有2B(在2T tokens上训练)和7B(在6T tokens上训练)模型,包括基础和指令调整版本。在8192个token的上下文长度上进行训练。允许商业使…...

数据结构-查找与排序
数据结构再往后就是比较零散的各种操作,查找与排序是其中最常出现的,今天来总结一下常用的查找与排序所用的方法 查找 顺序查找 最简单的查找方式,遍历,然后比较 bool search1(int *a,int n,int k){for (int i1;i<n;i){//遍…...

【前端素材】推荐优质后台管理系统Qovex平台模板(附源码)
一、需求分析 1、定义 后台管理系统是一种用于管理和监控网站、应用程序或系统的在线工具。它通常是通过网页界面进行访问和操作,用于管理网站内容、用户权限、数据分析等。后台管理系统是网站或应用程序的控制中心,管理员可以通过后台系统进行各种管理…...

MATLAB环境下基于短时傅里叶变换和Rényi熵的脑电信号和语音信号分析
傅里叶变换是不能很好的反映信号在时域的某一个局部范围的频谱特点的,这一点很可惜。因为在许多实际工程中,人们对信号在局部区域的特征是比较关心的,这些特征包含着十分有用的信息。这类信号因为在时域(或者是空间域)上具有突变的非稳定性和…...
Go语言调用身份证实名认证API方法-标准版身份证实名认证接口
翔云身份证实名认证接口具备高准确度的身份信息比对能力,包括姓名、身份证号码、人脸照片等信息的一致性验证,并能实时反馈验证结果。 以下是GO语言调用翔云身份实名认证API的代码: package mainimport ("fmt""bytes"&q…...

数据库增删改查
DDL: 数据定义语言,用来定义数据库对象(数据库、表、字段)DML: 数据操作语言,用来对数据库表中的数据进行增删改DQL: 数据查询语言,用来查询数据库中表的记录DCL: 数据控制语言,用来创建数据库用户、控制数…...

10.CSS3的calc函数
CSS3 的 calc 函数 经典真题 CSS 的计算属性知道吗? CSS3 中的 calc 函数 calc 是英文单词 calculate(计算)的缩写,是 CSS3 的一个新增的功能。 MDN 的解释为可以用在任何长度、数值、时间、角度、频率等处,语法如…...

echrts 全国地图、各省市地图json文件下载
DataV.GeoAtlas地理小工具系列...
如何使用1688.item_search_shop API获取阿里巴巴店铺商品信息
要使用1688的item_search_shop API获取阿里巴巴店铺的商品信息,你通常需要遵循以下步骤: 1. 注册并获取API密钥 首先,你需要在阿里巴巴开放平台(如1688开放平台)上注册一个开发者账号,并创建一个应用。创…...

PLC_博图系列☞基本指令“取反RLO”
PLC_博图系列☞基本指令“取反RLO” 文章目录 PLC_博图系列☞基本指令“取反RLO”背景介绍取反RLO说明示例 关键字: PLC、 西门子、 博图、 Siemens 、 取反RLO 背景介绍 这是一篇关于PLC编程的文章,特别是关于西门子的博图软件。我并不是专业的PLC…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...