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

在这里插入图片描述

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

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

相关文章

2024-04-25 问AI: 介绍一下 ISBI 挑战赛

文心一言 ISBI挑战赛是由IEEE国际生物医学成像研讨会(IEEE International Symposium on Biomedical Imaging,简称ISBI)主办的一项具有很高国际学术声誉的竞赛。ISBI挑战赛旨在推动生物医学成像领域的技术进步和应用创新,通过提供…

docker 安装geoipupdate

前提是docker已安装 一:执行命令: docker run --env-file /usr/local/etc/GeoIP.conf -v /usr/local/GeoIP2:/usr/share/GeoIP ghcr.io/maxmind/geoipupdate /usr/local/etc/GeoIP.conf :本地配置的账号,秘钥 GEOIPUPDATE_AC…

QJ71C24N-R2 三菱Q系列串行通信模块

三菱Q系列串行通信模块是通过串行通信用的RS-232、RS-422/485线路将对方设备与Q系列可编程控制器CPU相连接,以实现如下所示的数据通信的模块。通过使用调制解调器/终端适配器,可以利用公共线路(模拟/数字)实现与远程设备间的数据通信。 QJ71C24N-R2参数说明:串行RS-…

统一建模语言UML图

uml 图定义 Unified Modeling Language(统一建模语言,UML)是一种用于软件系统设计和建模的标准化语言。它提供了一套图形化的符号和约定,用于描述软件系统的结构、行为和交互,以及系统与外部环境之间的关系。UML通常用…

DIY高考倒计时小软件python实现

目录 一.前言 二.完整代码 三.代码分析 一.前言 高考倒计时是指从当前日期到高考日期之间的天数倒计时。高考是指中国的普通高等学校招生全国统一考试,是中国教育系统中最为重要和决定性的考试之一。在高考前,学生和家长通常会关注离高考还有多少天,以便合理安排备考时间…

为什么36KbRAM会配置为32K×1,少的那4Kb去哪了?

首先我们需要了解BRAM的相关知识,可以参考下面两篇文章: Xinlinx FPGA内的存储器BRAM全解-CSDN博客 为何有时简单双口RAM是真双口RAM资源的一半-CSDN博客 本问题的背景是: 每个36Kb块RAM也可以配置成深度宽度为64K 1(当与相邻的36KB块RA…

淘宝新店没有流量和访客怎么办

淘宝新店没有流量和访客时,可以采取以下措施来提升店铺的流量和吸引更多的访客: 3an推客是给商家提供的营销工具,3an推客CPS推广模式由商家自主设置佣金比例,以及设置商品优惠券,激励推广者去帮助商家推广商品链接&…

SVG 绘制微信订阅号icon

效果 代码 <!DOCTYPE html> <html> <body><svg xmlns"http://www.w3.org/2000/svg" version"1.1" width"600" height"600"><rect x"0" y"0" rx"0" ry"0" width&…

JavaEE 初阶篇-深入了解 UDP 通信与 TCP 通信(综合案例:实现 TCP 通信群聊)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 UDP 通信 1.1 DatagramSocket 类 1.2 DatagramPacket 类 1.3 实现 UDP 通信&#xff08;一发一收&#xff09; 1.3.1 客户端的开发 1.3.2 服务端的开发 1.4 实现 …

【信息系统项目管理师知识点速记】整合管理:实施整体变更控制

8.8 实施整体变更控制 1. 定义: 审查所有变更请求,批准变更,管理对可交付成果、项目文件和项目管理计划的变更,并对变更处理结果进行沟通的过程。 2. 重要性: 项目经理对整体变更控制过程负最终责任。变更请求可能影响项目范围、产品范围、项目管理计划或项目文件的任何…

Arm功耗管理精讲与实战

安全之安全(security)博客目录导读 思考 1、为什么要功耗管理&#xff1f;SOC架构中功耗管理示例&#xff1f;功耗管理挑战&#xff1f; 2、从单核->多核->big.LITTLE->DynamIQ&#xff0c;功耗管理架构演进? 3、什么是电压域&#xff1f;什么是电源域&#xff1f…

企微SCRM私域运营:构建高效客户关系管理的关键路径

随着市场竞争的日益激烈&#xff0c;客户关系管理&#xff08;CRM&#xff09;已成为企业提升竞争力的关键所在。而企业微信&#xff08;企微&#xff09;作为连接企业与客户的桥梁&#xff0c;其强大的SCRM&#xff08;社会化客户关系管理&#xff09;功能为企业提供了私域运营…

Centos 7.9 一键安装 Oracle 12CR2(240116)单机 PDB

前言 Oracle 一键安装脚本&#xff0c;演示 CentOS7.9 一键安装 Oracle 12CR2 单机PDB&#xff08;240116&#xff09;过程&#xff08;全程无需人工干预&#xff09;。&#xff08;脚本包括 ORALCE PSU/OJVM 等补丁自动安装&#xff09; ⭐️ 脚本下载地址&#xff1a;Shell脚…

[论文笔记] Pai-megatron 细节解读之self.jitter_noise参数 (防止过拟合)

if self.training and self.jitter_noise > 0:hidden_states *= torch.empty_like(hidden_states).uniform_(1.0 - self.jitter_noise, 1.0 + self.jitter_noise) 请你讲一下这段代码 对 hidden_states 添加的 self.jitter_noise 抖动,是一种减轻大模型过拟合策略。…

C++高级特性:异常概念与处理机制(十四)

1、异常的基本概念 异常&#xff1a;是指在程序运行的过程中发生的一些异常事件&#xff08;如&#xff1a;除数为0&#xff0c;数组下标越界&#xff0c;栈溢出&#xff0c;访问非法内存等&#xff09; C的异常机制相比C语言的异常处理&#xff1a; 函数的返回值可以忽略&…

《系统架构设计师教程(第2版)》第10章-软件架构的演化和维护-01-软件架构演化概述

文章目录 1. 演化的重要性2. 架构演化示例 教材中&#xff0c;本节名为&#xff1a;“软件架构演化和定义的关系” 1. 演化的重要性 演化目的&#xff1a;维持软件架构自身的有用性 为什么说&#xff0c;软件架构是演化来的&#xff0c;而不是设计来的&#xff1f; 软件架构的…

【LAMMPS学习】八、基础知识(4.3)TIP3P水模型

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

Python 基础 (Pandas):Pandas 入门

1. 官方文档 API reference — pandas 2.2.2 documentation 2. 准备知识&#xff1a;Pandas 数据结构 Series & DataFrame 2.1 Series 2.1.1 创建 Series 类型数据 一个 Series 对象包含两部分&#xff1a;值序列、标识符序列。可通过 .values (返回 NumPy ndarry 类型…

Fisher 准则分类

目录 一、什么是Fisher 准则 二、具体实例 三、代码实现 四、结果 一、什么是Fisher 准则 Fisher准则&#xff0c;即Fisher判别准则&#xff08;Fisher Discriminant Criterion&#xff09;&#xff0c;是统计学和机器学习中常用的一种分类方法&#xff0c;由统计学家罗纳…

Git使用说明,持续更新

Git使用说明 git branch 用于管理分支&#xff0c;包括查看、创建、删除、重命名分支等操作。 git branch: 列出本地仓库中的所有分支&#xff0c;并标识当前所在的分支。git branch <branch-name>: 创建一个新分支&#xff0c;名称为 <branch-name>。git branc…