总结MYSQL中VHARCHAR和TEXT

总结MYSQL中VHARCHAR和TEXT - 程序员古德

前几天在设计表结构时,针对表中的一个字段使用text还是使用varchar是受到了开发同学的挑战。本篇文章对text和varchar的区别做个总结。

VHARCHAR和TEXT对比

  1. char(n)varchar(n)中括号中n代表字符的个数,并不代表字节个数,所以当使用了中文的时候(utf8)意味着可以插入m个中文,但是实际会占用m*3个字节。
  2. 同时char和varchar最大的区别就在于char不管实际value都会占用n个字符的空间,而varchar只会占用实际字符应该占用的空间+1,并且实际空间+1<=n。
  3. 超过char和varchar的n设置后,字符串会被截断。
  4. char的上限为255字节,varchar的上限65535字节,text的上限为65535。
  5. char在存储的时候会截断尾部的空格,varchar和text不会。
  6. varchar会使用1-3个字节来存储长度,text不会。

下图可以非常明显的看到结果:

ValueCHAR(4)Storage RequiredVARCHAR(4)Storage Required
‘’’ ’4 bytes‘’1 byte
‘ab’'ab ’4 bytes‘ab’3 bytes
‘abcd’‘abcd’4 bytes‘abcd’5 bytes
‘abcdefgh’‘abcd’4 bytes‘abcd’5 bytes

总体来说:

  1. char,存定长,速度快,存在空间浪费的可能,会处理尾部空格,上限255。
  2. varchar,存变长,速度慢,不存在空间浪费,不处理尾部空格,上限65535,但是有存储长度实际65532最大可用。
  3. text,存变长大数据,速度慢,不存在空间浪费,不处理尾部空格,上限65535,会用额外空间存放数据长度,顾可以全部使用65535。

场景问题

从空间方面

varchar

varchar在mysql中满足最大行限制,也就是65535(16k)字节,在mysql中使用utf8(mysql中的utf8和我们正常的编码utf8不同)字符集一个字符占用三个字节。

  1. 使用utf8字符编码集varchar最大长度是(65535-2)/3=21844个字符(超过255个字符会有2字节的额外占用空间开销,所以减2,如果是255以下则减1),mysql中使用utf8字符集一个字符占用3个字节。
  2. 使用utf8mb4字符集varchar最大长度是(65535-2)/4=16383 个字符(超过255个字符会有2字节的额外占用空间开销,所以减2,如果是255以下则减1,mysql中utf8mb4字符集也就是我们通常使用的utf8mb4字符集),mysql中使用utf8mb4字符集一个字符占用4个字节。

text

最大限制是64k,采用utf8字符集占用(262144-2)/3=87381个字符;采用utf8mb4字符集占用(262144-2)/4=65535个字符。除此之外基于 blob(二进制大对象)类型的变体还有如下三个:

  1. text 的最大长度为 65,535 字节,与 varchar 相同。
  2. mediumtext 的最大长度约为 16 兆字节。
  3. longtext 的最大长度约为 4 gb。

另外,从官方文档中可以得知当varchar大于某些数值的时候其会自动转换为text,大概规则如下:

  1. 大于varchar(255)变为 tinytext
  2. 大于varchar(500)变为 text
  3. 大于varchar(20000)变为 mediumtext

所以对于过大的内容使用varchar和text没有太多区别。

关于性能方面

索引会是影响性能的最关键因素,而对于text来说只能添加前缀索引,并且前缀索引最大只能达到1000字节。而貌似varhcar可以添加全部索引,但是经过测试其实也不是。由于会进行内部的转换,所以long varchar其实也只能添加1000字节的索引,如果超长了会自动截断。如下代码:

localhost.test>create table test (a varchar(1500));
Query OK, 0 rows affected (0.01 sec)localhost.test>alter table test add index idx_a(a);
Query OK, 0 rows affected, 2 warnings (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 2localhost.test>show warnings;
+---------+------+---------------------------------------------------------+
| Level   | Code | Message                                                 |
+---------+------+---------------------------------------------------------+
| Warning | 1071 | Specified key was too long; max key length is 767 bytes |
| Warning | 1071 | Specified key was too long; max key length is 767 bytes |
+---------+------+---------------------------------------------------------+

从上面可以明显单看到索引被截断了,而这个767是由于innodb自身的问题,使用innodb_large_prefix设置。

总结

  1. 使用varchar可以选择大小,并为存储设置上限;使用text则不能设置上限,固定长度65535(16k)。
  2. 使用varchar可以设置默认值;text不可以设置默认值。
  3. 使用varchar可以进行排序查询;text不可以排序查询。
  4. 使用varchar超过255长度都会隐式的转为text处理。
  5. 涉及text列的查询可能会导致在磁盘而不是内存中创建临时表。使用基于磁盘的表会显着降低性能,这意味着使用 text 的查询可能会慢得多。
  6. 使用text字段时需要将text字段单独放到一个表中。

完!

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

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

相关文章

笔记本分屏怎么操作?3个方法提高工作效率!

“有朋友知道笔记本怎么才能实现分屏吗&#xff1f;我在工作时&#xff0c;经常需要来回切换屏幕&#xff0c;效率真的太低了&#xff0c;有什么方法可以实现两个屏幕同时使用吗&#xff1f;” 在现代生活中&#xff0c;多任务处理已成为常态&#xff0c;而笔记本分屏技术为用户…

电脑监控软件丨功能详情丨特点分析

电脑监控软件的出现&#xff0c;是在信息技术的飞速发展以及计算机使用的普及的背景下产生的。随着计算机在企业、学校以及家庭等各个场所的广泛使用&#xff0c;管理和保护计算机数据安全的问题变得越来越重要。因此&#xff0c;电脑监控软件应运而生&#xff0c;旨在帮助用户…

DaoWiki(基于Django)开发笔记 20231114-阿里云mysql外部访问

文章目录 创建mysql用户&#xff0c;用户远程访问配置阿里云安全策略下载安装mysql workbench 创建mysql用户&#xff0c;用户远程访问 创建用户 CREATE USER dao_wiki% IDENTIFIED BY password;授权访问dao_wiki数据库 GRANT ALL PRIVILEGES ON dao_wiki.* TO dao_wiki%; F…

浅谈掌动智能验收测试主要服务内容

所谓验收测试是对软件的功能性、性能效率、兼容性、易用性、可靠性、信息安全性、维护性、可移植性进行测试&#xff0c;对产品说明、用户文档集进行审阅&#xff0c;为科研项目、信息工程项目等进行第三方验收评测&#xff0c;交付验收测试报告。本文将介绍掌动智能验收测试主…

Rust 中的引用与借用

目录 1、引用与借用 1.1 可变引用 1.2 悬垂引用 1.3 引用的规则 2、slice 类型 2.1 字符串字面量其实就是一个slice 2.2 总结 1、引用与借用 在之前我们将String 类型的值返回给调用函数&#xff0c;这样会导致这个String会被移动到函数中&#xff0c;这样在原来的作用域…

Python数据结构: 列表(List)详解

在Python中&#xff0c;列表&#xff08;List&#xff09;是一种有序、可变的数据类型&#xff0c;被广泛用于存储和处理多个元素。列表是一种容器&#xff0c;可以包含任意数据类型的元素&#xff0c;包括数字、字符串、列表、字典等。本文将深入讨论列表的各个方面&#xff0…

TCP连接出现大量CLOSE_WAIT不回收的问题排查

背景 日常运维过程中&#xff0c;收到“应用A”突然挂起没有处理请求的告警&#xff0c;然后触发“存活检查”不通过&#xff0c;自动重启了。 问题 为什么“应用A”突然挂起&#xff1f; 分析 排查过程很长&#xff0c;走了很多弯路&#xff0c;这里只列出本案例有效行动…

K8S知识点(八)

&#xff08;1&#xff09;实战入门-Label 通过标签实现Pod的区分&#xff0c;说白了就是一种标签选择机制 可以使用命令是否加了标签&#xff1a; 打标签&#xff1a; 更新标签&#xff1a; 筛选标签&#xff1a; 修改配置文件&#xff0c;重新创建一个pod 筛选&#xff1…

vue项目中在scss代码中使用data中的变量

尽管在日常开发中&#xff0c;这类情况实际上很少出现。 VUE2: 在HTML中使用时&#xff0c;请确保将cssVars绑定在需要使用CSS变量的元素或该元素的上层元素上。 <template><div :style"cssVars"><div class"test"/></div><…

Java集合框架

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 本…

jwt工作原理及组成结构

JWT&#xff08;JSON Web Token&#xff09;是一种用于身份验证和授权的开放标准&#xff08;RFC 7519&#xff09;&#xff0c;它是一种安全的、轻量级的身份验证方式。 JWT由三部分组成&#xff1a;头部&#xff08;Header&#xff09;、载荷&#xff08;Payload&#xff09…

代理模式-静态动态代理-jdk动态代理-cglib动态代理

代理模式 静态代理 动态代理&#xff1a;jdk动态代理 cglib动态代理 注意 &#xff1a;下面的代码截图 要配合文字去看 我对代码的每一步都做了解释 所以需要配合图片观看提取吗1111https://pan.baidu.com/s/1OxQSwbQ--t5Zvmwzjh1T0A?pwd1111 这里直接把项目文件 及代码 …

Qt生产者消费者使用QWaitCondition

继承 QThread 重写 void run() Q_DECL_OVERRIDE; 调用start()开启线程 使用 QMutex mutex; QWaitCondition newdataAvailable; 将互斥量锁住 QMutexLocker locker(&mutex); m_stoptrue; 生产者唤醒所有线程表示创建了资源&#xff1a; newdataAvailable.wa…

MySQL(15):存储过程与函数

存储过程概述 含义&#xff1a; 存储过程的英文是 Stored Procedure 。它的思想很简单&#xff0c;就是一组经过 预先编译 的 SQL 语句的封装。 执行过程&#xff1a; 存储过程预先存储在 MySQL 服务器上&#xff0c;需要执行的时候&#xff0c;客户端只需要向服务器端发出调用…

小程序(uniapp)获取位置失败提示用户手机是否开启定位或小程序是否授权位置信息

//地址信息获取 getAddressInfo(){let thatthis;try{ uni.getLocation({ type: gcj02, geocode:true,//设置该参数为true可直接获取经纬度 success: function (resF){console.log(resF) },fail: function (){ //地址获取失败提示用户执行相关操作that.openSetting(); }});}catc…

一文简单聊聊protobuf

目录 基本介绍 原理 同类对比 为什么要使用protobuf? 基本介绍 protobuf的全称是Protocol Buffer&#xff0c;是Google提供的一种数据序列化协议。Protocol Buffers 是一种轻便高效的结构化数据存储格式&#xff0c;可以用于结构化数据序列化&#xff0c;很适合做数据存储…

RFID技术在仓储物流管理中的应用方案

一、方案背景 当前市场竞争日益激烈&#xff0c;提高生产效率、降低运营成本对来说企业至关重要&#xff0c;仓储物流管理在各个行业广泛应用&#xff0c;设计和建立完善的仓储管理流程&#xff0c;提高仓储周转效率&#xff0c;减少运营资金的占用&#xff0c;将冻结的资产转…

【ElasticSearch系列-08】ElasticSearch处理对象间的关联关系

ElasticSearch系列整体栏目 内容链接地址【一】ElasticSearch下载和安装https://zhenghuisheng.blog.csdn.net/article/details/129260827【二】ElasticSearch概念和基本操作https://blog.csdn.net/zhenghuishengq/article/details/134121631【三】ElasticSearch的高级查询Quer…

github私有仓库开发,公开仓库发布版本

文章目录 github私有仓库开发,公开仓库发布版本需求背景实现思路GitHub Releases具体步骤广告 github私有仓库开发,公开仓库发布版本 需求背景 github私有仓库开发,公开仓库发布版本&#xff0c;既可以保护源代码,又可以发布版本给用户使用。许多知名软件项目都采用了这样的开…

K8s-Traefik Ingress Controller

Traefik Ingress Controller Traefik 是一个为了让部署微服务更加便捷而诞生的现代 HTTP 反向代理、负载均衡工具。traefik 本身设计的就能够实时跟 kubernetes api 交互&#xff0c;感知后端 service&#xff0c;pod 等的变化&#xff0c;自动更新配置并重载。 traefik 是一…