当前位置: 首页 > news >正文

Mysql中表字段VARCHAR(N)类型及长度的解释

 本文将针对MySQL 中 varchar (N)类型字段的存储方式进行解释,主要是对字符和字节的关系的理解。

 1. varchar (N) 中的 N

  • varchar (N) 中的 N 表示字符数,而不是字节数。这意味着 `N` 表示你可以存储多少个字符。

   字符数:指的是字符的个数,而不是这些字符在存储中所占的字节数。

   例如,varchar (255)意味着可以存储最多 255 个字符。

 2. 字符与字节的关系

  • VARCHAR字段的实际存储大小会受到字符集(如 UTF-8)影响。UTF-8 编码对于不同字符有不同的字节占用。
  •  常见字符(如英文字母、数字)占用 1 字节。
  • 一些 Unicode 字符(例如汉字、表情符号等)则需要 3 字节或 4 字节。

   - 如果你使用 UTF-8 编码,一个汉字通常占用 3 个字节。因此,varchar (255) 对于汉字来说,可以存储 255 个汉字,而如果是英文字符,可以存储 255 个字符,且每个字符占 1 字节。

3. VARCHAR`存储长度的计算

  • 存储长度:MySQL 会使用不同的字节数来存储 VARCHAR 的长度信息,具体如下:
  •  如果 N < 256,MySQL 会使用 1 字节来存储该字段的长度。
  •  如果 N >= 256,MySQL 会使用 2 字节来存储字段长度。

 这是为了节省存储空间。对于较小的 N,1 字节就足够表示长度;而对于较大的 N,2 字节可以表示更大的长度值。

    这里会有同学问,为什么 如果 N < 256,MySQL 会使用 1 字节 来存储该字段的长度。 如果 N >= 256,MySQL 会使用 2 字节 来存储字段长度?是规定好的么?

    是的,MySQL 对 VARCHAR`类型字段的长度存储采用了这样的设计,是为了在性能与空间优化之间取得平衡。这种机制的设计有以下几个原因:

 1.空间效率

      存储的长度指的是记录在表中实际数据的长度信息(即字符串的实际长度)。MYSQL需要用某种方式记录每个varchar字段的长度,因为varchar是可变的长度的类型。

      如果N<256时,最长只能记录255个字符,那么使用一个字节(8位)来存储长度信息就足够了。1字节可以标识0~255之间的数字。

      如果 `N >= 256`,则可能需要表示的长度会大于 255 个字符,这时 MySQL 使用 **2 字节** 来记录长度信息。2 字节可以表示的数字范围是 0 到 65535。

      这种机制可以有效节省存储空间。对于大部分使用 varchar 字段的场景,字段长度通常小于 256 个字符,因此只需 1 字节来存储长度,避免了使用 2 字节造成的额外空间浪费。

  2.性能考虑

     使用 1 字节表示长度时,MySQL 在读取和处理数据时所需的资源更少,读取速度会更快。
     当 N < 256 时,直接使用 1 字节来存储长度信息,不仅减少了存储所需的内存或磁盘空间,也加快了操作速度,因为处理较小的数据量会提升效率。

 3. 符合常见的数据使用模式

     在实际应用中,许多字符串数据(如姓名、邮件地址等)长度通常较短,常见字段长度往往小于 256 个字符。因此,使用 1 字节足以满足大多数场景的需求,而 2 字节则适用于存储长字符串数据的特殊场景。
     这种划分基于常见的数据使用模式,既能在存储小数据时提高效率,又能在需要时扩展到较大的字段长度。

**例子说明**
       如果你有一个 VARCHAR(100) 字段,存储的数据最多不超过 100 个字符。对于这个字段,MySQL 会使用 1 个字节来记录它的实际长度(0-255 之间的数),这意味着只需 1 字节就可以表示这个字段中字符串的长度。
       如果你有一个 `VARCHAR(300)` 字段,存储的数据可以超过 255 个字符。为了能记录所有可能的长度(0-300),MySQL 必须使用 2 个字节来存储长度信息,因为 1 字节不能表示超过 255 的数字。

结论:
     MySQL 的这一设计是规定好的,目的是在性能和空间使用之间做出折中。对于大多数应用场景,短文本占主导,因此 1 字节表示长度足够高效;而在需要更长文本的情况下,使用 2 字节也可以处理更大范围的字符长度。 

 4.存储限制与内存操作

     - MySQL 中的每个表中,所有 varchar字段的最大总字节数限制是65535 字节。
     - 在查询、排序或创建临时表时,MySQL 会基于 VARCHAR 的实际字节数来计算内存使用。
     - 因此,VARCHAR(255) 如果用于存储汉字,实际的内存占用会比存储英文字符多。

 **具体实例**
假设有一个表,包含如下两个字段:

1. name: varchar(255),用于存储英文名。
2. description: varchar(255),用于存储汉字描述。

存储英文字符的情况
  假设 name 字段存储的是英文字符:"John Doe"(10个字符)。
  varchar(255) 为该字段分配了 255 字符的空间,而实际存储了 10 个字符。
  由于字符是 ASCII 编码的,英文字符只占用 1 字节,所以这个字段占用了 10 字节的存储空间。
  存储长度:MySQL 使用 1 字节来存储 `name` 字段的长度,表示 10 个字符。

存储汉字的情况
  假设 description`字段存储的是中文字符:"这是一个描述"(7个汉字)。
  在 UTF-8 编码中,每个汉字占用 3 字节。因此,`description` 实际占用了 7 * 3 = 21 字节。
  由于 varchar(255)仍然分配了 255 个字符的空间,但由于是汉字,实际的字节数更高,因此该字段占用了 21 字节来存储数据。
存储长度:MySQL 使用 1 字节来存储 description字段的长度,表示 7 个汉字。

总内存占用
   name字段占用 10 字节数据 + 1 字节长度 = 11 字节。
   description字段占用 21 字节数据 + 1 字节长度 = 22 字节。
   总共的内存占用 = 11 + 22 = 33 字节。

总结
- varchar(N) 表示存储最多 N个字符,而不是字节数,实际的字节数取决于字符集(如 UTF-8)中的字符所占字节数。
- 对于存储长度,MySQL 使用 1 字节来表示字段长度(如果 N小于 256),使用 2 字节来表示更大长度的字段。
- 存储过程中要注意字符的字节数,因为不同字符集和字符可能占用不同的字节空间,特别是对于非 ASCII 字符(如汉字)。

5、问题总结

1.只有1字节和2字节两种选择吗,再大的字节不行么?

   在 MySQL 中,varchar类型字段的长度信息只有 1 字节和 2 字节 两种选择,而不会使用更多的字节。具体原因和设计考量如下:

   1. varchar 的设计限制

     - MySQL 对 varchar字段的最大长度限制为 65535 字节。这是由 MySQL 的存储机制决定的,一个表中 varchar字段的总字节数不能超过 65535 字节。
     - 因此,使用 2 字节已经足够表示 varchar字段的最大长度:
     - 1 字节能表示的长度范围是 0 到 255(总共 256 个值)。
     - 2 字节 能表示的长度范围是 0 到 65535(总共 65536 个值)。
     - 由于 varchar字段的设计最大长度为 65535 字节,2 字节已经足以表示所有可能的长度,所以没有必要再增加字节数。

  2. 更大数据类型的选择

   如果需要存储比 varchar 更大且更长的文本数据,MySQL 提供了其他数据类型,专门用于处理超长字符串或文本数据。这些类型在存储时采用不同的机制,而不是通过增加更多字节的长度信息。以下是常用的几种更大类型:

 - TEXT类型:TEXT 数据类型允许存储更大的文本数据,分为四种变体:
     1. TINYTEXT:最大 255 字节,使用 1 字节存储长度。
     2. TEXT:最大 65535 字节,使用 2 字节存储长度。
     3. MEDIUMTEXT:最大 16 MB,使用 3 字节存储长度。
     4. LONGTEXT:最大 4 GB,使用 4 字节存储长度。

   - BLOB 类型:与 TEXT`类型相似,但专门用于存储二进制数据。BLOB 也分为 TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB`四种变体,它们的存储机制和长度信息与 TEXT类型类似。

2. 为什么不使用更多字节?

   - 效率与需求的平衡:对于varchar 字段,2 字节已经能表示所有可能的长度(最大 65535 字节),而增加更多的字节来存储长度信息会显著增加存储开销,但并不会带来额外的好处,因为 varchar 类型本身就有长度限制。
   - 更大数据类型的存在:如果应用需要存储更大规模的数据,使用 `TEXT` 或 `BLOB` 类型是更合适的选择,而不是通过增加 varchar 字段的长度来实现。

结论:
     MySQL 选择使用 1 字节 或 2 字节 来存储varchar 字段的长度信息,因为这是对varchar 类型设计的最优折衷。对于更大的数据存储需求,MySQL 提供了 `TEXT`、`BLOB` 这类数据类型,它们使用 3 字节或 4 字节来存储长度信息,满足更大的存储需求。因此,在varchar 类型中没有必要使用超过 2 字节来表示长度信息。

3.使用 TEXT 或 BLOB 类型就不会增加存储开销了么

使用 TEXT 或 BLOB`类型虽然可以存储更大的数据,但它们也会带来额外的存储开销,与 varchar 类型相比。具体来说,主要体现在以下几个方面:

1. 额外的长度信息存储
   - 与 varchar 类型类似,`TEXT` 和 `BLOB` 类型也需要存储每个字段的长度信息。不过,它们的长度信息更大,因此会导致一定的开销。
   例如:
   - TEXT类型:
     - `TINYTEXT`:最大 255 字节,使用 1 字节存储长度。
     - `TEXT`:最大 65535 字节,使用 2 字节存储长度。
     - `MEDIUMTEXT`:最大 16 MB,使用 3 字节存储长度。
     - `LONGTEXT`:最大 4 GB,使用 4 字节存储长度。
   
   - BLOB类型:
     - `TINYBLOB`:最大 255 字节,使用 1 字节存储长度。
     - `BLOB`:最大 65535 字节,使用 2 字节存储长度。
     - `MEDIUMBLOB`:最大 16 MB,使用 3 字节存储长度。
     - `LONGBLOB`:最大 4 GB,使用 4 字节存储长度。

   总结: TEXT和 BLOB的长度存储信息随着数据类型的变化需要更多的字节,而 varchar 类型最多只使用 2 字节来存储长度信息。

2. 存储和处理机制差异
   - TEXT和 BLOB数据存储的方式通常与varchar 不同。TEXT和BLOB类型是外部存储(out-of-row)类型,意味着它们的实际数据可能存储在表的外部,而不是直接存储在行数据中。这是因为它们的内容可能非常大。
   - 因为这些数据可能存储在不同的存储位置(例如,外部文件、其他存储区域),所以读取 TEXT或 BLOB类型数据时,通常会有额外的 I/O 开销,即读取或写入这些字段时可能比 VARCHAR类型更慢,尤其在涉及大量数据时。
   - VARCHAR 数据直接存储在行内,因此读取速度通常会更快。

 3. 空间开销
     - TEXT 和 BLOB类型的存储开销相较于 VARCHAR可能更大。因为:
     - varchar 只存储实际字符的字节数和长度信息(1 或 2 字节)。
     - TEXT和 BLOB在存储数据时,除了长度信息之外,还可能引入额外的空间开销,用于管理外部存储的元数据、指针等。
   
   **举个例子**:如果你存储的是非常小的文本数据(比如 10 个字符的英文字符串),使用 TEXT类型相比 VARCHAR类型可能会带来更多的存储开销,尤其是当存储的数据量非常小,TEXT类型的存储机制可能会浪费更多的空间。

 4. 性能差异
    查询效率:对于 `VARCHAR` 字段,查询性能通常较好,因为它的存储方式是行内存储,数据直接保存在行中,不需要额外的 I/O 操作。
   - 对于 TEXT和BLOB字段,虽然它们可以存储更大的数据,但查询时可能会有额外的 I/O 开销,因为 MySQL 可能需要从外部存储中读取数据(特别是当数据量非常大时)。这种存储方式更适合处理大数据量的字段,而不是小文本。

 总结:TEXT 和 BLOB 的开销

- 存储开销:TEXT 和 BLOB 类型相较于 varchar 会有额外的存储开销,特别是当字段长度较小且需要存储的小文本时。它们的长度信息存储会使用更多的字节(最多 4 字节),而且数据存储在行外可能会增加 I/O 开销。
- 性能差异:对于较小的文本数据,varchar 类型通常会更高效,因为它是内存中连续存储的,而 TEXT 和 BLOB 类型可能需要额外的 I/O 操作。
- 适用场景:TEXT 和 BLOB 更适合存储大量文本或二进制数据,比如文章、图片数据、日志等。而 varchar 则适合存储较短的字符串数据,如用户名、电子邮件地址、简单描述等。

在选择 varchar 还是 TEXT 类型时,通常需要根据数据的实际大小来决定。如果存储的数据较小,varchar 是更合适的选择;如果存储的数据量较大,且长度可能会变化较大,TEXT或 BLOB类型则更为适用。

相关文章:

Mysql中表字段VARCHAR(N)类型及长度的解释

本文将针对MySQL 中 varchar (N)类型字段的存储方式进行解释&#xff0c;主要是对字符和字节的关系的理解。 1. varchar (N) 中的 N varchar (N) 中的 N 表示字符数&#xff0c;而不是字节数。这意味着 N 表示你可以存储多少个字符。 字符数&#xff1a;指的是字符的个数&…...

git提交信息写错处理方式

在Git中&#xff0c;你可以通过使用rebase命令来合并提交记录。以下是一个简单的步骤来合并一系列提交&#xff1a; 使用git rebase -i开始交互式变基。在打开的编辑器中&#xff0c;你会看到一个提交列表。若要合并提交&#xff0c;将要合并的提交前面的pick改为squash或s。保…...

C#从零开始学习(用unity探索C#)(unity Lab1)

初次使用Unity 本章所有的代码都放在 https://github.com/hikinazimi/head-first-Csharp Unity的下载与安装 从 unity官网下载Unity Hub Unity的使用 安装后,注册账号,下载unity版本,然后创建3d项目 设置窗口界面布局 3D对象的创建 点击对象,然后点击Move Guzmo,就可以拖动…...

【SpringBoot】15 Echarts+Thymeleaf 绘制各种图表

Gitee仓库 https://gitee.com/Lin_DH/system 介绍 ECharts是百度开源的一个前端组件。它是一个使用 JavaScript 实现的开源可视化库&#xff0c;可以流畅的运行在 PC 和移动设备上&#xff0c;兼容当前绝大部分浏览器&#xff08;IE8/9/10/11&#xff0c;Chrome&#xff0c;…...

网络学习笔记

一、网络的结构与功能 网络的鲁棒性与抗毁性 如果在移走少量节点后网络中的绝大部分节点仍然是连通的&#xff0c;那么就该网络的连通性对节点故障具有鲁棒性 网络上的动力学 动力系统&#xff1a;自旋、振子或混沌的同步、可激发系统 传播过程&#xff1a;信息传播与拥堵…...

[论文笔记]HERMES 3 TECHNICAL REPORT

引言 今天带来论文HERMES 3 TECHNICAL REPORT&#xff0c;这篇论文提出了一个强大的工具调用模型&#xff0c;包含了训练方案介绍。同时提出了一个函数调用标准。 为了简单&#xff0c;下文中以翻译的口吻记录&#xff0c;比如替换"作者"为"我们"。 聊天模…...

MySQL-19.多表设计-一对多-外键

一.多表问题分析 二.添加外键 三.外键约束的问题...

MySQL程序介绍<一>

目录 MySQL程序简介 mysqld - MySQL 服务器 ​编辑 mysql - MySQL 命令⾏客⼾端 MySQL程序简介 1.MySQL安装完成通常会包含如下程序&#xff1a; Linux系统程序⼀般在 /usr/bin⽬录下&#xff0c;可以通过命令查看 windows系统⽬录&#xff1a; 你的安装路径\MySQL Server…...

Leetcode 第 419 场周赛题解

Leetcode 第 419 场周赛题解 Leetcode 第 419 场周赛题解题目1&#xff1a;3318. 计算子数组的 x-sum I思路代码复杂度分析 题目2&#xff1a;3319. 第 K 大的完美二叉子树的大小思路代码复杂度分析 题目3&#xff1a;思路代码复杂度分析 题目4&#xff1a;3321. 计算子数组的 …...

那些年 我们说走就走

那些年 我们说走就走 —— 2022-03-20 二月十八 春分 我总是钟情于原生景色&#xff0c;犹如那句 “落霞与孤鹜齐飞&#xff0c;秋水共长天一色。” 所绘。 我热爱骑行&#xff0c;向往自然&#xff0c;对有着 “中国人的景观大道” 之称的 318 国道川藏线憧憬已久。 17 年暑…...

MySQL初识

在了解什么是MySQL前&#xff0c;我们先了解一下什么是数据库&#xff1f;&#xff1f; 1. 数据库简介 1.1 什么是数据库 数据库是20世纪60年代末发展起来的⼀项重要技术&#xff0c;已经成为计算机科学与技术的⼀个重要分⽀。数据库技术主要是⽤来解决数据处理的⾮数值计算问…...

基于Java微信小程序的的儿童阅读系统的详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…...

利用 OBS 推送 WEBRTC 流到 smart rtmpd

webrtc whip 推流 & whep 拉流简介 RFC 定义 通用的 webrtc 对于 SDP 协议的交换已经有对应的 RFC 草案出炉了。这就是 WHIP( push stream ) & WHEP ( pull stream ) . WHIP RFC Link: https://www.ietf.org/archive/id/draft-ietf-wish-whip-01.html WHEP RFC Link:…...

【python】极简教程3-函数

函数是将代码组织到可重用块中的一种方法。 函数调用 Python提供了许多内置函数,例如print: print(Hello, World!)函数调用通常包含函数名,后跟圆括号,括号内是参数列表。参数是传递给函数的数据,函数会基于这些数据执行操作。 数学函数 使用math函数前需要先导入mat…...

Python案例小练习——小计算器

文章目录 前言一、代码展示二、运行展示 前言 这是用python实现一个简单的计器。 一、代码展示 def calculate(num1, op, num2):if op "":return float(num1) float(num2)elif op "-":return float(num1) - float(num2)elif op "*":return…...

仓储数字化蓝图

1、仓储能力建设 2、仓储数字化建设...

【数字图像处理】第5章 图像空域增强方法

上理考研周导师的哔哩哔哩频道 我在频道里讲课哦 目录 5.1 图像噪声 相关概念 ①图像噪声的产生 ② 图像噪声分类 ③ 图像噪声特点 5.2 图像增强方法分类 ①图像增强概念 ②图像增强目的 ③图像增强技术方法: 5.3 基于灰度变换的图像增强 1. 概述: 2. 灰度变换…...

idea 发布jar包

当你有一个能正常编译的项目&#xff0c;以springboot为例&#xff0c;有两步步骤 打包配置 打包 一、打包配置 1.点击右上角快捷按钮/文件-->项目结构&#xff0c;打开项目结构设置 2.项目结构-->Artifacts&#xff0c;如图所示选择 3.在Create JAR from Modules配置…...

c语言字符串函数strstr,strtok,strerror

1&#xff0c;strtok函数的使用和模拟实现 char * strtok(char * str,const char * sep) 会有static修饰变量&#xff0c;有记忆功能&#xff0c;会保存字符串的位置&#xff0c;下次找再继续找。 1)sep参数指向一个字符串&#xff0c;它包含了0个或者多个由sep字符中一个或…...

【Java】—JavaBean转换方法详解

JavaBean间的转换 ⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记链接&#x1f449;https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个star~&#x1f60a; 文章目录 JavaBean间的转换1 Apache Co…...

[Vue3核心语法] setup语法糖

一、setup 概述 setup是Vue3中一个新的配置项&#xff0c;值是一个函数&#xff0c;它是 Composition API “表演的舞台”&#xff0c;组件中所用到的&#xff1a;数据、方法、计算属性、监视......等等&#xff0c;均配置在setup中。 特点&#xff1a; setup函数返回的对象中…...

RabbitMQ 入门(三)SpringAMQP五种消息类型(Basic Queue)

一、Spring AMQP 简介 SpringAMQP是基于RabbitMQ封装的一套模板&#xff0c;并且还利用SpringBoot对其实现了自动装配&#xff0c;使用起来非常方便。 SpringAmqp的官方地址&#xff1a;https://spring.io/projects/spring-amqp SpringAMQP提供了三个功能&#xff1a; - 自动…...

2024双十一买什么好?双十一高性价比数码好物推荐!

​双十一购物狂欢节即将来临&#xff0c;这是一年中家电和数码产品优惠力度较大的时候。然而&#xff0c;随着产品种类越来越丰富&#xff0c;选择一款合适的商品也变得越发困难。今天&#xff0c;我为大家推荐一些双十一期间值得入手的高品质好物&#xff0c;让我们一同来了解…...

MySQL 查找连续相同名称的记录组,并保留每组内时间最大的一条记录

要求&#xff1a;查找连续相同名称的记录组&#xff0c;并保留每组内时间最大的一条记录&#xff0c;同时计算每组记录的 num 总和。 今天有人问了我一个问题&#xff0c;大致就是下面这样的数据结构&#xff08;原谅我实在不知道怎么描述这个问题&#xff09; 然后需要得到下面…...

three.js 使用geojson ,实现中国地图区域,边缘流动效果

three.js 使用geojson &#xff0c;实现中国地图区域&#xff0c;边缘流动效果 在线链接&#xff1a;https://threehub.cn/#/codeMirror?navigationThreeJS&classifyexpand&idgeoBorder 国内站点预览&#xff1a;http://threehub.cn github地址: https://github.co…...

数据中台业务架构图

数据中台的业务架构是企业实现数据驱动决策和业务创新的关键支撑。它主要由数据源层、数据存储与处理层、数据服务层以及数据应用层组成。 数据源层涵盖了企业内部各个业务系统的数据&#xff0c;如 ERP、CRM 等&#xff0c;以及外部数据来源&#xff0c;如社交媒体、行业数据…...

Docker学习笔记(2)- Docker的安装

1. Docker的基本组成 镜像&#xff08;image&#xff09;&#xff1a;Docker镜像就像是一个模板&#xff0c;可以通过这个模板来创建容器服务。通过一个镜像可以创建多个容器。最终服务运行或者项目运行就是在容器中。容器&#xff08;container&#xff09;&#xff1a;Docker…...

PostgreSql的备份和升级

目录 版本概述&#xff1a; 跨大版本数据迁移 QProcess 调用相关进程进行备份和恢复 版本概述&#xff1a; 该数据库版本主要分为主要版本和次要版本&#xff0c;大版本基本每年发布一次&#xff0c;小版本则每几个月即发布&#xff0c;更新较快。在10.0之前所使用的数据库版…...

联系拯救者Y9000P2022笔记本电脑进入BIOS快捷键

联系拯救者Y9000P2022笔记本电脑进入BIOS快捷键 文章目录 联系拯救者Y9000P2022笔记本电脑进入BIOS快捷键1. 进入BIOS快捷键2. 快速进入BIOS设置界面3. 快速进入启动项选择界面 1. 进入BIOS快捷键 进入BIOS设置界面的快捷键为F2快速进入启动项选择界面的快捷键为F12 2. 快速进…...

compose navigation 自定义navtype

Jetpack compose navigation with custom NavType https://www.youtube.com/watch?vqBxaZ071N0c&t182s 定义两个路由 Serializable data object DogListRouteSerializable data class DogDetailRoute(val dog: Dog,val breedSize: BreedSize ) 即两个页面&#xff0c;…...