MySQL数据类型:字符串类型详解

MySQL数据类型:字符串类型详解

在MySQL数据库中,字符串数据类型用于存储各种文本信息。这些数据类型主要包括CHARVARCHARTEXTBLOB等。

CHAR与VARCHAR

CHAR

CHAR类型用于存储固定长度的字符串。它的长度在创建表时就已确定,长度范围从1到255个字符。CHAR类型的特点是读取速度快,因为每条记录占用相同的空间,数据库可以快速定位到具体位置。但是,CHAR类型的缺点是可能会浪费存储空间,因为不管实际存储的数据长度如何,都会使用固定长度,不足部分以空格填充。

VARCHAR

VARCHAR类型是MySQL中用得最频繁的字符串类型之一,用于存储可变长度的字符串。与CHAR类型相比,VARCHAR节省空间,因为它只占用必要的空间加上一个额外的字节来记录长度(如果列声明的长度超过255,则需要两个字节)。VARCHAR的最大长度可以达到65,535个字符,但实际限制取决于行大小和字符集。VARCHAR类型非常适合用来存储长度不一的字符串,比如用户输入的数据。

使用建议

  • 当字段的最大长度难以预测或文本长度有较大变化时,使用VARCHAR
  • 在数据长度经常变动的应用中,VARCHAR可以减少空间浪费。
  • 考虑到性能和存储效率的平衡,合理设置VARCHAR的最大长度,避免过大或过小。
VARCHAR最大长度的影响因素

行大小限制

MySQL中,单行的最大数据量是固定的。对于标准的表,这个限制通常是65,535字符,这包括了所有列的数据以及行内的其他元数据。如果表中包含多个大字段或多个VARCHAR字段,这些字段的最大潜在长度总和可能会超过这个行大小限制。因此,虽然理论上单个VARCHAR可以支持到65,535个字符,实际上可能会因为行大小限制而无法达到这个长度。

字符集编码

VARCHAR的最大长度还受到字符集编码的影响。不同的字符集编码字符所需的字节数不同:

  • 在使用单字节字符集(如latin1)时,每个字符占用1个字节。
  • 在使用多字节字符集(如utf8mb4)时,每个字符可能占用2到4字节。这意味着如果VARCHAR字段采用utf8mb4编码,其最大字符数将受到实际字节数的限制,即使你设置长度为65,535,实际存储的字符数量可能只有16,383个字符(因为65,535字节除以4字节/字符)。

其他列的存储需求

表中其他列的数据类型和存储需求也会影响VARCHAR字段的最大长度。例如,如果表中还包含其他大量的固定长度字段(如CHAR或大的INT字段),这些字段占用的空间也会从行大小限额中扣除,进而影响VARCHAR字段能够分配的最大空间。

字节,字符和编码的关系

在计算机中,一个字符所占的字节大小取决于字符的编码方式。不同的编码系统对字符进行编码的方法不同,因此所需的存储空间也不同。以下是几种常见的字符编码方式和它们对应的字节大小:

  1. ASCII编码:最初的ASCII码是用7位(一个字节的部分)来表示一个字符,因此,一个ASCII字符等于1个字节。后来,扩展的ASCII(例如ISO 8859)使用8位,即1个字节来表示一个字符。

  2. UTF-8编码:这是一种变长的编码方式,可以使用1到4个字节来表示一个字符。对于标准的ASCII字符(如英文字母和数字),仍然只需要1个字节。但对于其他一些特殊字符(如拉丁文扩展、希腊文等),可能需要2个字节,而对于大多数常用汉字或其他复杂字符,通常需要3个字节。某些特殊的符号和很少用的字符集则可能使用4个字节。

  3. UTF-16编码:这种编码通常使用2个或4个字节来表示一个字符。大部分常见的字符,包括所有的基本多语言平面的字符(如汉字),使用2个字节表示。而那些不常用的字符,如一些古文字符或特殊符号,会使用4个字节表示(通过代理对来编码)。

  4. UTF-32编码:在UTF-32编码中,每个字符均使用4个字节表示。这种编码方式简单统一,但相对于其他编码方式占用更多的存储空间。

TEXT与BLOB

TEXT

TEXT类型用于存储大量文本数据。TEXT列不存储在数据库行内,而是作为大型对象存储在外部,只在行内保留一个指针。因此,TEXT类型可以存储大量数据,直到65,535字节(TEXT)、16,777,215字节(MEDIUMTEXT)或4,294,967,295字节(LONGTEXT)。使用TEXT类型的时候需要注意,处理这类数据可能会消耗更多的CPU和内存资源。

BLOB

BLOB(Binary Large Object)类型与TEXT类型相似,但用于存储大型的二进制数据,如图片、音频和视频等。BLOB同样存储在外部,并通过行内指针进行访问。根据存储需求的不同,BLOB类型分为TINYBLOBBLOBMEDIUMBLOBLONGBLOB

选择合适的字符串类型

在选择适合的字符串类型时,考虑以下因素:

  • 数据的最大可能长度:预估数据的最大长度,选择合理的数据类型以避免浪费空间或数据截断。
  • 查询性能需求:固定长度的CHAR更适合频繁搜索的场景,因为它的读取速度通常更快。
  • 数据的变动频率:如果数据内容变化频繁,选择VARCHAR可以减少对存储空间的浪费。
  • 存储大文本或二进制数据:对于需要存储大量文本或二进制数据的应用,应选择TEXTBLOB类型。

QA

varchar(10) 和 varchar(20) 的区别?

因为varchar是可变字符串,所以实际存储是一样的,但是在没有从存储引擎拿到数据前,不知道给varchar分配多大的内存,所以会根据定于的长度先分配,所以varchar(20) 可能比varchar(10)占用更多的内存空间

既然VARCHAR长度可变,那我要不要定到最大? 就像使用VARCHAR(5)和VARCHAR(200)存储 '陈哈哈’的磁盘空间开销是一样的。那么使用更短的列有什么优势呢?

事实证明有很大的优势。更长的列会消耗更多的内存,因为MySQL通常会分配固定大小的内存块来保存内部值。当然,在没拿到存储引擎存储的数据之前,并不会知道我这一行拿出来的数据到底有多长,可能长度只有1,可能长度是500,那怎么办呢?那就只能先把最大空间分配好了,避免放不下的问题发生,这样实际上对于真实数据较短的varchar确实会造成空间的浪费。
举例:我向数据类型为:varchar(1000)的列插入了1024行数据,但是每个只存一个字符,那么这1024行真实数据量其实只有1K,但是我却需要约1M的内存去适应他。所以最好的策略是只分配真正需要的空间。

参考链接

  • MySQL官方文档:https://dev.mysql.com/doc/refman/8.0/en/char.html

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

书生·浦语大模型实战营之Llama 3 高效部署实践(LMDeploy 版)

书生浦语大模型实战营之Llama 3 高效部署实践(LMDeploy 版) 环境,模型准备LMDeploy chatTurmind和Transformer的速度对比LMDeploy模型量化(lite)LMDeploy服务(serve) 环境,模型准备 InternStudio 可以直接使用 studio-conda -t …

查找总价格为目标值的两个商品 ---- 双指针

题目链接 题目: 分析: 解法一: 暴力解法, 将每两个的和都算出来, 判断是否为目标值解法二: 数组中的数是按升序排序的, 我们可以定义左右指针 如果和小于目标值, 则应该让和变大, 所以左指针右移如果和大于目标值, 则应该让和变小, 所以右指针左移 思路: 定义left 0, righ…

使用Krukal算法解决图的最小生成树问题

Kruskal 算法 Kruskal算法是一种用于寻找连通图中最小生成树的算法。最小生成树是一个包含图中所有顶点的树,且边权重之和最小。Kruskal算法是一种贪心算法,它的基本思想是:每次选择边权重最小的边来扩展树,直到树包含所有的顶点…

一周学会Django5 Python Web开发-Django5 ORM执行SQL语句

锋哥原创的Python Web开发 Django5视频教程: 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计49条视频,包括:2024版 Django5 Python we…

Spring 注解开发详解

1. 注解驱动入门案例介绍 1.1 需求描述 1.需求:实现保存一条数据到数据库。 2.表结构:create table account(id int primary key auto_increment,name varchar(50),money double(7,2)); 3.要求:使用spring框架中的JdbcTemplate和DriverMana…

Python 使用相对路径读取文件失败

python open一个问及那时使用绝对路径可以,但是使用相对路径时报错,找不到指定文件 解决步骤如下: 添加Python配置 在新增的配置Json文件添加下图红框这一行

阿里云OSS

进入阿里云官网,手机号短信登录

Ansible 中的copy 复制模块应用详解

作者主页:点击! Ansible专栏:点击! 创作时间:2024年4月25日13点40分 Ansible 中的 copy 模块用于将文件或目录从本地计算机或远程主机复制到远程主机上的特定位置。它是一个功能强大的模块,可用于各种文…

prometheus helm install 如何配置告警模版

对接企业微信 获取企业id 注册完成之后,通过企业微信官网登录后台管理,在【我的企业】的企业信息里面,获取到Alertmanager服务配置需用到的第一个配置:企业ID 获取部门id 部门ID 在【通讯录】中,添加一个子部门&a…

无人机+自组网:2U机架车载式自组网电台技术详解

自组网的特点包括自发现、自动配置、自组织和自愈等。由于网络中的节点可以随时加入或离开,自组网需要能够自动感知拓扑结构的变化,并快速调整路由策略以适应新的网络环境。此外,自组网中的节点还需要具备节能、安全和分布式管理等特性&#…

maixcam如何无脑运行运行别人的模型(以安全帽模型为例)

maixcam如何无脑运行运行别人的模型(以安全帽模型为例) 本文章主要讲如何部署上传的模型文件,以及如果你要把你模型按照该流程应该怎么修改,你可以通过该文章得到你想要的应该,该应用也包含的退出按钮,是屏…

质量管理系统( QMS):一文扫盲,质量重于泰山。

一、什么是QMS系统 QMS系统是质量管理系统(Quality Management System)的缩写。它是一种组织内部用于管理和控制质量相关活动的体系,旨在确保产品或服务符合质量标准和客户要求。 QMS系统通常包括一系列文件、程序和流程,用于规…

Linux常用命令总结(四):文件权限及相关命令介绍

1. 文件属性信息解读 1. 文件类型和权限的表示 0首位表示类型。在Linux中第一个字符代表这个文件是目录、文件或链接文件 符号对应文件类型-代表文件dd 代表目录l链接文档(link file); 1-3位确定属主(该文件的所有者)拥有该文件的权限。 4-6…

【信息收集】端口扫描masscan负载均衡识别lbd

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与学习之用,读者将信息做其他用途,由Ta承担全部法律及连带责任,文章作者不承担任何法律及连带责任。 1、什么是masscan masscan在kali系统上是自带的端口扫描…

【golang学习之旅】报错:a declared but not used

目录 报错原因解决方法参考 报错 代码很简单,如下所示。可以发现a和b都飙红了: 运行后就会出现报错: 报错翻译过来就是a已经声明但未使用。当时我很疑惑,在其他语言中从来没有这种情况。况且这里的b不是赋值了吗,怎…

SSL证书一年要多少钱

经常会被人问道:“安装SSL证书一年得要多少钱?”其实证书的类型不同、功能不同、品牌不同,证书的价格也会不一样。SSL证书的价格因其类型、品牌、购买渠道以及所包含的服务和支持等因素而有所不同。通常一年的费用从几十元到几万元不等。 一…

[Swift]单元测试

编写单元测试是确保你的代码质量和功能正确性的重要步骤 一、编写单元测试的详细流程 1. 创建一个新的Xcode项目 如果你尚未创建一个项目,首先你需要在Xcode中创建一个新的iOS项目: 打开Xcode,选择“File” > “New” > “Project”…

【黑马点评Redis——004达人探店】

1.发布探店笔记 2.点赞 利用Redis中的Set集合来判断是否点赞过。 3.点赞排行榜 可以通过SortedSet来按点赞时间进行排序。 4.好友关注 4.1.关注和取关 4.2.共同关注 可以通过set实现交集的功能 4.3.关注推送 4.3.1 拉模式 拉模式(Pull)&#x…

Android 13 Layer数据结构

Layer::State state的定义 State mDrawingState; 一个mDrawingState的变量struct State {Geometry active_legacy;Geometry requested_legacy;int32_t z;ui::LayerStack layerStack;#endifuint32_t flags;uint8_t reserved[2];int32_t sequence; // changes when visible regi…

解决Oracle锁表的方法

在实际工作中,并发量比较大的项目,经常会出现锁表的问题,下面我将复现这个问题,并给出解决方法。 一、问题复现 1、session1修改aabb表的B字段为迪迦奥特曼,但是不提交该事务。 2、session2也修改这行的这个字段。 发…