mysql 中 varchar 和 text 的区别

varchar 数据类型

如何理解 varchar(50)

varchar(50) 中的 50 在 mysql5.0 及以上默认是存储的字符数,5.0 以下,默认是字节长度。

varchar 占据的存储空间

varchar 占据的存储空间大概有以下几部分组成:

  • varchar 类型用来存储【实际字符有多少个】这条信息的存储空间。
  • 用来存储实际字符内容的存储空间,比如对于 utf-8 编码,每个字符可能占用 1 - 4 个字节,实际有 3 个字符(且每个字符占 3 个字节),那么这部分要占用的存储空间为 3 字符 x 3 字节/字符 = 9 字节。

varchar 最大支持的是 65535 个字节而不是字符

VARCHAR 能存储的最大长度会因为你在表定义中使用的字符集不同而发生变化,以 utf-8 为例:

mysql> create table varchar_test2(col_1 varchar(65535))charset=utf8 engine=innodb;
ERROR 1074 (42000): Column length too big for column 'col_1' (max = 21845); use BLOB or TEXT insteadmysql> create table varchar_test2(col_1 varchar(21845))charset=utf8 engine=innodb;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBsmysql> create table varchar_test2(col_1 varchar(21844))charset=utf8 engine=innodb;
Query OK, 0 rows affected (0.02 sec)

因此在使用了 UTF-8 的字符集时,VARCHAR 的最大长度为 21844。

ps:我实际测下来只有最大仅支持 16383。

如何选择合适的 varchar 字符长度

在保留一定冗余的前提下,不要给 varchar 设置过大的字符长度

虽然使用 VARCHAR (50)VARCHAR (1000) 存储‘abcd’的存储空间开销是一样的,但是当你在读取数据时,把这些数据读取到内存的过程中,MySQL 数据库需要分配相应大小的内存空间来存放数据。

所以更大的 VARCHAR 列在读取时要使用更大的内存空间,即使它实际上只存储了一丁点数据。

并且在操作这个表的过程中,如果遇到一些聚合(GROUP BY)或排序(ORDER BY)的操作,需要调用内存临时表或磁盘临时表时,性能会更加糟糕。

除此之外给 varchar 设置过大的字符长度还会带来一些其他问题:

  • 导致行溢出,而行溢出的数据在读取时需要多一个 IO 操作,也会造成 InnoDB 表空间越来越大。
  • InnoDB 中的大字段在做更新和删除操作时,只能进行悲观操作,这会造成并发性能下降。
  • MySQL 中的最大行长度是 65535 字节,包含所有类型的列,因此不可能让一个 varchar 类型的字段把空间都占了的。

补充:另外,因为 InnoDB 的数据页默认是 16K,每个页中至少存放 2 行数据,因此建议 VARCHAR 字段的总长度不要超过 8K。

varchar 和 text 的区别

  • VARCHAR:
    • 存储在 VARCHAR 类型字段中的数据是按照实际长度存储
    • 在某些情况下,VARCHAR 可能会占用更少的存储空间,因为它只存储实际使用的字节数。
  • TEXT:
    • TEXT 是用于存储大块文本数据的数据类型,可以存储最大长度为 64KB 的数据。
    • TEXT 类型的字段占用固定的存储空间
    • TEXT 数据在存储时会进行额外的处理和管理,因此可能会有轻微的性能开销。

总的来说,如果您需要存储较小的文本数据,VARCHAR 可能在性能方面更优,因为它占用的存储空间可能会较小。但是需要注意的是,当数据超过了 VARCHAR 定义的长度时,会进行截断处理,导致部分数据丢失。

如果您需要存储大块的文本数据,或者数据的长度不确定,使用 TEXT 类型更为合适。TEXT 类型不会对数据进行截断处理,并且为了性能更好地处理文本数据,还可以结合使用全文索引等技术。

参考

  • https://www.imooc.com/read/88/article/2357

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

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

相关文章

Python入门教学——输入任意长度的int整型一维数组

使用python输入一个任意长度的整型一维数组: nums input("请输入整数数组,用空格分隔: ") nums [int(i) for i in nums.split( )] # 将每个数转换为整型后输出 运行结果: 【注】如果不强制转换类型,数字…

功能测试进阶建议,学习思路讲解

1. 深入了解测试理论: 了解测试的原理、方法和最佳实践,包括黑盒测试、白盒测试、灰盒测试等。可以阅读相关的书籍或参加在线课程。 2. 学习相关测试工具: 掌握常用的测试工具,如缺陷发现工具、性能测试工具、安全测试工具等。可以…

matlab求矩阵的伪逆或者负二分之一次方

如果X不是满秩矩阵的时候,那么不能使用inv()函数来求X的逆,因为X此时不存在逆,但是我们可以求X的伪逆。 (1)有以下两种方法求X的伪逆: 假设 X[1 2 1;1 2 1;2 3 4]; 1, pinvXpinv(X); 2, [U,D,P]svd(X); r…

如何使用YOLOv8代码框架中的RT-DETR

1. RT-DETR RT-DETR是由由此,百度推出了——RT-DETR (Real-Time DEtection TRansformer) ,一种基于 DETR 架构的实时端到端检测器,其在速度和精度上取得了 SOTA 性能。 RT-DETR开源的代码在百度自己的飞桨paddlepaddle上,因此非…

基于天鹰算法优化概率神经网络PNN的分类预测 - 附代码

基于天鹰算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于天鹰算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于天鹰优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络的光滑…

新手必看!!附源码!!STM32通用定时器输出PWM

一、什么是PWM? PWM(脉冲宽度调制)是一种用于控制电子设备的技术。它通过调整信号的脉冲宽度来控制电压的平均值。PWM常用于调节电机速度、控制LED亮度、产生模拟信号等应用。 二、PWM的原理 PWM的基本原理是通过以一定频率产生的脉冲信号&#xff0…

【5 树与二叉树】统计二叉树结点值和。

typedef struct BiTNode{int data;struct BiTNode *lchild,*rchild; }*BiTree,BiTNode;int sum(BiTree T){if(Tnull)return 0;return T->datasum(T->lchild)sum(T->rchild); }

Android:Google三方库之Firebase集成详细步骤(二)

Analytics分析 1、将 Firebase 添加到您的 Android 项目(如果尚未添加),并确保在 Firebase 项目中启用了 Google Analytics(分析): 如果您要创建新的 Firebase 项目,请在项目创建过程中启用 G…

实时错误’-2147217887‘多步OLB DB 操作产生错误。如果可能,请检查OLE DB状态值

目录 背景问题问题分析问题解决 错误解决与定位技巧总结 背景 仍旧是学生信息管理系统的问题,当时做的时候没发现这么多问题呢,只能说明一件事,做的时候没有站在用户的角度考虑需求,设置了什么内容,就按照设置好的去测…

AIGC ChatGPT4总结SQL优化细节操作

数据库SQL优化是一个复杂的过程,它通常涉及到许多不同的技术和方法。以下是一些常用的SQL优化策略: 1. **索引使用**:索引可以极大地加速查询速度。但是,索引并不总是有好处的,因为它们需要额外的空间来存储,并且在插入和更新数据时可能会减慢速度。因此,选择正确的字段…

Unity中Shader纹理的过滤

文章目录 前言一、为什么要过滤?二、过滤方式1、Point(no filter) 无过滤2、Bilinear 双线性过滤3、Trilinear 三线性过滤 前言 Unity中Shader纹理的过滤 一、为什么要过滤? 事实上没有一个纹理上的纹素是与屏幕上的像素是一一对应的。 屏幕上的 一个…

redis安装(Windows和linux)

如何实现Redis安装与使用的详细教程 Redis 简介 Redis是一个使用C语言编写的开源、高性能、非关系型的键值对存储数据库。它支持多种数据结构,包括字符串、列表、集合、有序集合、哈希表等。Redis的内存操作能力极强,其读写性能非常优秀,且…

万字解析:十大排序(直接插入排序+希尔排序+选择排序+堆排序+冒泡排序+快速排序+归并排序+计数排序+基数排序+桶排序)

文章目录 十大排序排序算法复杂度及稳定性分析一、 排序的概念1.排序:2.稳定性:3.内部排序:4.外部排序: 二、插入排序1.直接插入排序2.希尔排序 三、选择排序1.直接选择排序方法一方法二直接插入排序和直接排序的区别 2.堆排序 四…

【蓝桥杯省赛真题45】Scratch九宫格游戏 蓝桥杯scratch图形化编程 中小学生蓝桥杯省赛真题讲解

目录 scratch九宫格游戏 一、题目要求 编程实现 二、案例分析 1、角色分析

轻量封装WebGPU渲染系统示例<37>- 多个局部点光源应用于非金属材质形成的效果(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/BasePbrMaterialMultiLights.ts 当前示例运行效果: 此示例基于此渲染系统实现,当前示例TypeScript源码如下: export class BasePbrMaterial…

2023年09月 Scratch(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 点击绿旗,运行程序后,舞台上的图形是?( ) A:画笔粗细为4的三角形 B:画笔粗细为5的六边形 C:画笔粗细为4的六角形 D:画笔粗细为5的三角形 答案:D 第2题 如下图所示,从所给…

缓存雪崩、击穿、穿透_解决方案

文章目录 缓存雪崩、击穿、穿透1.缓存雪崩造成缓存雪崩解决缓存雪崩 2. 缓存击穿造成缓存击穿解决缓存击穿 3.缓存穿透造成缓存穿透解决缓存穿透 缓存雪崩、击穿、穿透 一般用户数据存储于磁盘,读写速度慢。 使用redis作为缓存,相当于数据缓存在内存&a…

GZ031 应用软件系统开发赛题第1套

2023年全国职业院校技能大赛 应用软件系统开发赛项(高职组) 赛题第1套 工位号: 2023年4月 竞赛说明 一、项目背景 党的二十大报告指出,要加快建设制造强国、数字中国,推动制造业高端化、智能化、绿色化发展。《IDC中国制造企业调研报告,2021》报告指…

SpringBoot学习笔记-实现微服务:匹配系统(上)

笔记内容转载自 AcWing 的 SpringBoot 框架课讲义,课程链接:AcWing SpringBoot 框架课。 CONTENTS 1. 配置WebSocket2. 前后端WebSocket通信2.1 WS通信的建立2.2 加入JWT验证 3. 前后端匹配业务3.1 实现前端页面3.2 实现前后端交互逻辑3.3 同步游戏地图 …

年底了,我劝大家真别轻易离职...

年底了,一些不满现状,被外界的“高薪”“好福利”吸引的人,一般就在这时候毅然决然地跳槽了。 在此展示一套学习笔记 / 面试手册,年后跳槽的朋友可以好好刷一刷,还是挺有必要的,它几乎涵盖了所有的软件测试…