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)类型字段的存储方式进行解释,主要是对字符和字节的关系的理解。 1. varchar (N) 中的 N varchar (N) 中的 N 表示字符数,而不是字节数。这意味着 N 表示你可以存储多少个字符。 字符数:指的是字符的个数&…...
git提交信息写错处理方式
在Git中,你可以通过使用rebase命令来合并提交记录。以下是一个简单的步骤来合并一系列提交: 使用git rebase -i开始交互式变基。在打开的编辑器中,你会看到一个提交列表。若要合并提交,将要合并的提交前面的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 实现的开源可视化库,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,…...

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

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

MySQL-19.多表设计-一对多-外键
一.多表问题分析 二.添加外键 三.外键约束的问题...

MySQL程序介绍<一>
目录 MySQL程序简介 mysqld - MySQL 服务器 编辑 mysql - MySQL 命令⾏客⼾端 MySQL程序简介 1.MySQL安装完成通常会包含如下程序: Linux系统程序⼀般在 /usr/bin⽬录下,可以通过命令查看 windows系统⽬录: 你的安装路径\MySQL Server…...
Leetcode 第 419 场周赛题解
Leetcode 第 419 场周赛题解 Leetcode 第 419 场周赛题解题目1:3318. 计算子数组的 x-sum I思路代码复杂度分析 题目2:3319. 第 K 大的完美二叉子树的大小思路代码复杂度分析 题目3:思路代码复杂度分析 题目4:3321. 计算子数组的 …...

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

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

基于Java微信小程序的的儿童阅读系统的详细设计和实现(源码+lw+部署文档+讲解等)
详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不…...

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

c语言字符串函数strstr,strtok,strerror
1,strtok函数的使用和模拟实现 char * strtok(char * str,const char * sep) 会有static修饰变量,有记忆功能,会保存字符串的位置,下次找再继续找。 1)sep参数指向一个字符串,它包含了0个或者多个由sep字符中一个或…...
【Java】—JavaBean转换方法详解
JavaBean间的转换 ⭐⭐⭐⭐⭐⭐ Github主页👉https://github.com/A-BigTree 笔记链接👉https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以,麻烦各位看官顺手点个star~😊 文章目录 JavaBean间的转换1 Apache Co…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...