从底层理解MySQL-字符类型

目录

VARCHAR和CHAR

VARCHAR

CHAR

存储的长度超限

CHAR和VARCHAR的区别:

BLOB和TEXT


MySQL中除了数值类型外,另一个用的比较多的就是字符类型了。字符类型有很多不同种类:VARCHAR,CHAR,BLOB,TEXT

VARCHAR和CHAR

VARCHAR

VARCHAR是变长的字符类型,实际的存储格式如下图所示:

VARCHAR类型由prefixdata组成,其中prefix由一个或者两个字节构成,作用是指定data的长度。如果data的长度小于等于255,则prefix只需要一个字节,因为一个字节可表示的最大的无符号数就是255,如果data的长度大于255,则prefix需要用两个字节表示,而两个字节可表示的最大的无符号数是65535,由此可知VARCHAR最大可以存储65535个字符。

CHAR

CHAR是定长的字符类型,实际的存储格式如下图所示:

和VARCHAR不同的是,CHAR中只存储实际的内容,没有用来指定长度的prefix,并且CHAR最大可存储的字符数是255。假设一个CHAR(5)的字段,存储的内容只有4个字符,那么实际存储时会在最后加上1个空格来补齐至5个字符。而在查询时,返回的结果中末尾的空格将被移除,除非开启了PAD_CHAR_TO_FULL_LENGTH模式。

一个CHAR(5)的字段,分配了5个字符的空间,如下图所示:

当插入了abcd之后,实际存储的内容如下图所示:

 

当实际存储的字符长度不足时,MySQL会在末尾用空格补足。

而查询时,实际返回的内容中,末尾的空格又是被移除的,如下图所示:

用一个实际的例子演示一下:

1、准备一张表

create table `test_c` (a char(5) not null,b varchar(5) not null
) engine=InnoDB;

2、插入几条测试数据

insert into test_c (a,b)
values 
('abcd','abcd'),
('abcd ','abcd '),
(' abcd',' abcd');

3、查询结果

select concat("'",a,"'") as a,concat("'",b,"'") as b from test_c;

4、结果如下

+---------+---------+
| a       | b       |
+---------+---------+
| 'abcd'  | 'abcd'  |
| 'abcd'  | 'abcd ' |
| ' abcd' | ' abcd' |
+---------+---------+

可以发现查询时,返回的结果中末尾的空格都被移除了,不管末尾的空格是不是我们实际存储的值。那这种情况下就会出现问题,实际我们是需要末尾的空格的,但查询的结果末尾的空格被移除了。解决的方法是,开启PAD_CHAR_TO_FULL_LENGTH的SQL Mode

1、先查一下当前的SQL Mode:

select @@sql_mode;

 结果如下:

+--------------------------------------------+
| @@sql_mode                                 |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+

2、设置SQL Mode:

SET sql_mode=`PAD_CHAR_TO_FULL_LENGTH`;

3、再查询结果:

select concat("'",a,"'") as a,concat("'",b,"'") as b from test_c;

4、结果如下:

+---------+---------+
| a       | b       |
+---------+---------+
| 'abcd ' | 'abcd'  |
| 'abcd ' | 'abcd ' |
| ' abcd' | ' abcd' |
+---------+---------+

可以看到,设置了PAD_CHAR_TO_FULL_LENGTH的SQL Mode之后,CHAR类型的字段末尾的空格没有被移除。

存储的长度超限

当存储的字符长度超过了CHAR和VARCHAR设置的长度,在不同的情况下会有不同的效果。在严格模式下,超过长度的字符是不能保存成功的,系统会报错。在非严格模式下,能保存成功,CHAR类型的会截断超过长度的部分,并且不会有任何反映,VARCHAR类型的也会截断超过长度的部分,但是会抛出警告。

PS:
需要注意的是,CHAR和VARCHAR中存储的内容的长度是指的字符长度,不是字节长度,而字符长度跟选择的字符集有关,比如ASCII字符集可以存储英文和数字等,不能存储中文,因为一个中文字符占3个字节,UTF8字符集就可以存储中文了,但是UTF8不能存储emoji表情,因为emoji表情占4个字节,而UTF8MB4就可以存储emoji表情。

CHAR和VARCHAR的区别:

比较维度CHARVARCHAR
组成结构dataprefix+data
最低存储需求0字节1字节
最大长度25565535
存储时长度不足末尾用空格补齐不补齐
存储时长度超限(非严格模式)截断并且静默截断并且警告
存储时长度超限(严格模式)报错并且不能保存报错并且不能保存
查询时(无PAD_CHAR_TO_FULL_LENGTH)移除末尾空格不移除末尾空格
查询时(有PAD_CHAR_TO_FULL_LENGTH)不移除末尾空格不移除末尾空格

BLOB和TEXT

BLOB和TEXT主要是用来存储数据长度非常大的字符类型的,BLOB主要是存储二进制字符类型,TEXT则是存储字符串。
其中BLOB又包括了TINYBLOB,SMALLBLOB,MEDIUNBLOB,LONGBLOB,TEXT包括了TINYTEXT,SMALLTEXT,MEDIUNTEXT,LONGTEXTB

当BLOB和TEXT的值太大时,InnoDB会使用专门的外部存储区域来存储,这时就会在字段中用一个1~4个字节的指针,纪录下外部实际存储的区域。
MySQL对BLOB和TEXT类型的字段进行排序时,只会对字段的前max_sort_length个字节的内容而不是整个内容进行排序。

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

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

相关文章

如何使用ArcGIS Pro生成等高线

无论在制图还是规划中,经常会使用到等高线,大多数情况下,从网上获取的高程数据都是DEM文件,我们可以通过ArcGIS Pro来生成等高线,这里为大家介绍一下生成方法,希望能对你有所帮助。 数据来源 教程所使用的…

springboot206基于SpringBoot的农商对接系统的设计与实现

基于Spring Boot的农商对接系统的设计与实现 Design and implementation of agricultural business docking system based on Spring Boot 摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离…

【Chrono Engine学习总结】4-vehicle-4.3-两个vehicle碰撞测试

由于Chrono的官方教程在一些细节方面解释的并不清楚,自己做了一些尝试,做学习总结。 今天突发奇想,想试一下,是否可以实现两个vehicle的碰撞? 1、两辆vehicle的仿真 官方提供了demo_VEH_TwoCars这个demo&#xff0c…

React -- useEffect

React - useEffect 概念理解 useEffect是一个React Hook函数,用于在React组件中创建不是由事件引起而是由渲染本身引起的操作(副作用), 比 如发送AJAX请求,更改DOM等等 :::warning 说明:上面的组件中没有发生任何的用…

暴风一期 黑群晖折腾流水账

起因是想和女友一起分享各自手机中的小猫照片,经过上网查资料了解到了群晖,可惜正版白群晖售价太高: 无奈选择了黑群晖,白群晖其实也可以简单理解为一台电脑多装了几块硬盘,然后装了一个文件服务器系统,这个…

CoordConv(NeurIPS 2018)

paper:An Intriguing Failing of Convolutional Neural Networks and the CoordConv Solution official implementation:https://github.com/uber-research/coordconv 存在的问题 本文揭示并分析了CNN在两种不同类型空间表示之间转换能力的欠缺&#…

每日OJ题_二叉树dfs⑤_力扣230. 二叉搜索树中第K小的元素

目录 力扣230. 二叉搜索树中第K小的元素 解析代码 力扣230. 二叉搜索树中第K小的元素 230. 二叉搜索树中第K小的元素 难度 中等 给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数…

RocketMQ—RocketMQ消息重复消费问题

RocketMQ—RocketMQ消息重复消费问题 重复消费问题的描述 什么情况下会发生重复消费的问题: 生产者多次投递消息:如果生产者发送消息时,连接有延迟,MQ还没收到消息,生产者又发送了一次消息; 消费者方扩容…

3个wordpress中文企业主题模板

农业畜牧养殖wordpress主题 简洁大气的农业畜牧养殖wordpress主题,农业农村现代化,离不开新农人、新技术。 https://www.jianzhanpress.com/?p3051 老年公寓wordpress主题 浅绿色简洁实用的老年公寓wordpress主题,适合做养老业务的老年公…

三防平板丨三防工业平板电脑丨三防平板电脑有哪些优势?

三防平板电脑通常使用特殊材料和制造工艺来达到防水、防尘、防摔的目的,这样可以在极端条件下使用,并保证设备的稳定性和可靠性。因此,三防平板电脑适用于各种恶劣环境,如户外野营、物流、工业制造等应用场景。那么相比于普通消费…

【力扣 - 二叉树的直径】

题目描述 给你一棵二叉树的根节点,返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 提示: 树中节点数目在范围 [1, 10000] 内…

CSS基础属性

【三】基础属性 【1】高度和宽度 (1)参数 width(宽度):用于设置元素的宽度。可以使用具体的数值(如像素值)或百分比来指定宽度。 height(高度):用于设置元…