mysql中char与varchar的区别

使用WSL2安装ubuntu系统并配置深度学习环境 wsl2安装ubuntu部署深度学习环境的方法 阅读详情
在mysql教程中char与varchar的区别呢,都是用来存储字符串的,只是他们的保存方式不一样罢了,char有固定的长度,而varchar属于可变长的字符类型。
char与varchar的区别

char (13)长度固定, 如'www.jb51.net' 存储需要空间 12个字符

varchar(13) 可变长 如'www.jb51.net' 需要存储空间 13字符,

从上面可以看得出来char 长度是固定的,不管你存储的数据是多少他都会都固定的长度。而varchar则处可变长度但他要在总长度上加1字符,这个用来存储位置。所以实际应用中用户可以根据自己的数据类型来做。

再看看char,与varchar在速度上的区别吧。
复制代码 代码如下:

mysal>create tabe ab(v varchar(4),c char(4));
query ok ,0 rows affected(0.02 sec)
mysql>insert into abc values('ab ','ab ')
query ok ,1 row affected(0.00 sec);
mysql->select concat(v ,'+') ,concat(c ,'+') form abc
ab + | ab+
1rows in set (0.00 sec)

从上面可以看出来,由于某种原因char 固定长度,所以在处理速度上要比varchar快速很多,但是对费存储空间,所以对存储不大,但在速度上有要求的可以使用char类型,反之可以用varchar类型来实例。

注明:

在用char字符类型时内容后面有空间时必须作相关处理,要不就会把空格自动删除。

建意:

myisam 存储引擎 建议使用固定长度,数据列代替可变长度的数据列。
memory存储引擎 目前都使用固定数据行存储,因此无论使用char varchar列都没关系,
innodb 存储引擎 建意使用varchar 类型


以下是其它网友的补充


char是一种固定长度的类型,varchar则是一种可变长度的类型
  char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足.(在检索操作中那些填补出来的空格字符将被去掉)在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节).

在MySQL中用来判断是否需要进行对据列类型转换的规则

  1、在一个数据表里,如果每一个数据列的长度都是固定的,那么每一个数据行的长度也将是固定的.
  2、只要数据表里有一个数据列的长度的可变的,那么各数据行的长度都是可变的.
  3、如果某个数据表里的数据行的长度是可变的,那么,为了节约存储空间,MySQL会把这个数据表里的固定长度类型的数据列转换为相应的可变长度类型.
例外:长度小于4个字符的char数据列不会被转换为varchar类型

  对于MyISAM表,尽量使用Char,对于那些经常需要修改而容易形成碎片的myisam和isam数据表就更是如此,它的缺点就是占用磁盘空间

  对于InnoDB表,因为它的数据行内部存储格式对固定长度的数据行和可变长度的数据行不加区分(所有数据行共用一个表头部分,这个标头部分存放着指向各有关数据列的指针),所以使用char类型不见得会比使用varchar类型好。事实上,因为char类型通常要比varchar类型占用更多的空间,所以从减少空间占用量和减少磁盘i/o的角度,使用varchar类型反而更有利.

文章2:
字符应该是最常见的一种了,但似乎各个数据库都有所不同,比如oracle中就有啥varchar2之类。不过mysql似乎最多的还是集中在char和varchar上。
说说区别。char是固定长度的,而varchar会根据具体的长度来使用存储空间。比如char(255)和varchar(255),在存储字符串"hello world"的时候,char会用一块255的空间放那个11个字符,而varchar就不会用255个,他先计算长度后只用11个再加上计算的到字符串长度信息,一般1-2个byte来,这样varchar在存储不确定长度的时候会大大减少存储空间。

如此看来varchar比char聪明多了,那char有用武之地吗?还是很不少优势的。

一,存储很短的信息,比如门牌号码101,201……这样很短的信息应该用char,因为varchar还要占个byte用于存储信息长度,本来打算节约存储的现在得不偿失。

二,固定长度的。比如使用uuid作为主键,那用char应该更合适。因为他固定长度,varchar动态根据长度的特性就消失了,而且还要占个长度信息。

三,十分频繁改变的column。因为varchar每次存储都要有额外的计算,得到长度等工作,如果一个非常频繁改变的,那就要有很多的精力用于计算,而这些对于char来说是不需要的。


还有一个关于varchar的问题是,varchar他既然可以自动适应存储空间,那我varchar(8)和varchar(255)存储应该都是一样的,那每次表设计的时候往大的方向去好了,免得以后不够用麻烦。这个思路对吗?答案是否定的。mysql会把表信息放到内存中(查询第一次后,就缓存住了,linux下很明显,但windows下似乎没有,不知道为啥),这时内存的申请是按照固定长度来的,如果varchar很大就会有问题。所以还是应该按需索取。

总结:仔细看DZ的数据表,定长的字段基本还都是用char....
【Unity学习笔记】事件系统EventSystem 1.EventSystem物体 第一次在Unity中创建UI元素时,总会自动生成一个EventSystem物体,它包含三个组件:Transform、EventSystem、Standalone Input Module。如果我们把它删除了,会发现UI上的事件(比如点击、拖拽)将不会被检测到。没错,它就是用来处理UI相关的事件的。 1.1 EventSystem组件 EventSystem基于输入给物体发送事件,它在整个事件系统中扮演的主要角色是: 1.管理被选中的物体 2.管理正在使用的Input Modu 阅读详情

相关推荐

MySQL中的VARCHAR类型详解

在上面的示例中,我们创建了一个名为"users"的表,其中包含id、username和email字段。username字段的最大长度为50个字符,email字段的最大长度为100个字符。在上面的示例中,我们向"users"表插入了一条数据,包括id、username和email字段的值。在上面的示例中,我们查询了"users"表中username字段为’john.doe’的所有数据。在上面的示例中,我们新了"users"表中id为1的记录的email字段的值。

SmufHtml的博客 3003

MySQLvarchar水真的太深了——InnoDB记录存储结构

varchar(M) 能存多少个字符,为什么提示最大16383?innodb怎么知道varchar真正有多长?记录为NULL,innodb如何处理?某个列数据占用的字节数非常多怎么办?影响每行实际可用空间的因素有哪些?本篇围绕innodb默认行格式dynamic来说说原理。

卓越无关环境,保持空杯心态——靡不有初,鲜克有终 3万+

1-上市公司-高管政治关联数据-原始数据+结果+计算代码(2008-2022年)-社科数据.zip

上市公司高管政治关联数据集涵盖了2008至2022年的广泛信息,主要研究公司高层管理人员如董事长、总经理政府部门之间的任职经历或通过人际关系网建立的联系。这些数据对于分析企业行为、政府关系及资源配置具有重要价值。政治关联可能影响企业融资、投资决策和社会责任履行等方面,并且随着市场化和法治环境的改善,这种关联对企业行为的影响也可能发生变化。数据集包含多个关键指标,如证券代码、政治关联(PC)、政治关联程度(PCLevel)、以及针对总经理和董事长的具体政治关联情况(PC总经理、PC董事长、PCLevel总经理、PCLevel董事长)。这些指标有助于量化分析企业高管的政治关联程度,进而深入探讨其对企业行为和绩效的影响。数据集中的政治关联程度(PCLevel)根据行政级别或政治职位进行分级,为研究提供了精细化的分析工具。通过这些数据,研究者能够准确地评估政治关联对企业运营和战略决策的具体影响。

C#DevExpress的GridControl去掉重复的行

1.没有去重复界面 2.去掉重复界面 3.去重代码代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using DAL; namespace WindowsFormsApplicat

qq_44858151的博客 1233

Mysql——》varchar

VARCHAR列中的值为可变长字符串。VARCHAR的最大有效长度由最大行大小和使用的字符集确定。创建表:test 字符集:UTF8 字段:name,非空, char(255) 字段:address,非空,varchar(n),n是咱们即将见证的最大字符长度varchar(n)的最大字节数 = **65535 - **255*3 - 2 = 64768 varchar(n)的最大字符数 = 字节数/3 n = 64768/3 = 21589.33 (1)n=21589.33,创建表成功

小仙~ 3712

MySQL系列】VARCHAR的底层存储

VARCHAR类型可以存储长度可变的字符串,括号内的数字表示最大存储长度。例如,表示该字段可以存储最多 50 个字符的字符串,而则可以存储最多 500 个字符。

CSDN站内信: https://i.csdn.net/#/msg/chat/qyj19920704 3万+

解决MAC中vscode调试C++代码无法处理输入的问题

针对MAC电脑下vscode调试C/C++代码时,无法处理输入的问题,进行解决。

kikiLQQ的博客 1万+

输入c语言 为什么编译键黑了,这段C语言代码为什么编译过不去

#include #include #include #define MAX_COLS 20 /*定义 所能处理的最大列号*/#define M#include #include #include #define MAX_COLS 20 /*定义 所能处理的最大列号*/#define MAX_INPUT 1000 /*每个输入的最大长度*/in...

weixin_42315966的博客 373

C语言使用函数交换两个数的值

C语言用函数交换两个数的值

weixin_61787820的博客 1万+

这段c语言代码牛逼在哪?

有人说C语言是世界上最牛逼的语言,因为操作系统就是用C语言编写的,学好了C才能好的学习其他编程语言。为此,有人分享了下面一段代码,说是很牛逼的c语言代码,大家来看看,它究竟牛在哪里? 关于这段传说中很牛逼的C语言代码,你们能看出牛在哪里么?此外,还有一位国外的C语言高手,想挑战大家的水平,快来看看! 一位国外C语言高手的程序,挑战大家的C语言水平! 这是一段德国某位高中生用C语言写...

suxuecyuyan的博客 2983

为什么这段代码输入一个数之后显示不了结果

#include<stdio.h> #include<math.h> #define eps 1e-5 int main() { int i; double sum = 1.0, x; scanf_s("%f", &x); double result = 1.0; for (i = 1; ; i++) { result = (result * x) / i; sum = sum + result; if (result <eps) { break; } printf("

qq_51388393的博客 260

这段c语言代码牛逼在哪?看得我一脸懵逼!

有人说C语言是世界上最牛逼的语言,因为操作系统就是用C语言编写的,学好了C才能好的学习其他编程语言。为此,有人分享了下面一段代码,说是很牛逼的c语言代码,看得小编一脸懵逼。大家来看看,它究竟牛在哪里? 下面是一份C/C++学习资料,加入小编C/C++学习群:825414254,获取源码。 关于这段传说中很牛逼的C语言代码,小编是看不出牛在哪里,你们呢?此外,还有一位国外的C语言高手,想挑战大...

844

C语言如何输入一个字符串?

如何输入一个字符串

Jambo!的博客 2万+

这段C语言到底是牛逼在哪呢?

有人说C语言是世界上最牛逼的语言,因为操作系统就是用C语言编写的,学好了C才能好的学习其他编程语言。为此,有人分享了下面一段代码,说是很牛逼的c语言代码,看得小编一脸懵逼。大家来看看,它究竟牛在哪里? 想要跟小编共同进步可加群五八三六五零四一零进行探讨 关于这段传说中很牛逼的C语言代码,小编是看不出牛在哪里,你们呢?此外,还有一位国外的C语言高手,想挑战大家的水平,快来看看! 一位国外C语言高手...

qq_43351159的博客 658

牛逼c语言代码,这段c语言代码牛逼在哪?

原标题:这段c语言代码牛逼在哪?有人说C语言是世界上最牛逼的语言,因为操作系统就是用C语言编写的,学好了C才能好的学习其他编程语言。为此,有人分享了下面一段代码,说是很牛逼的c语言代码,看得W3Cschool小编一脸懵逼。大家来看看,它究竟牛在哪里?#include"stdio.h"main(void){float a;printf(" 数据排列nn");printf("请输入相应的数据:");...

weixin_39576294的博客 3246

c语言函数的值传递机制(swap函数怎么通过形参改变实参的值)

swap函数中体现出的c语言函数的值传递机制(形参中int * &是什么意思) 目前初学C语言,对于深层内存机制了解不是十分透彻,只是将自己的理解方式简单记录一下。 我们知道交换两个变量的数值非常简单,只需要一个中间变量swap void main(){ int a=3, b=5,swap; swap = a; a = b; b = swap; } 这样就完成了a和b两个变量的数值交换,但是当我们把这段代码原封不动的搬进一个函数swap里好像又不是这么回事了。 无法达到预想目的swap函数

HowToLearnJava的博客 2469

【理解C语言】为什么要区分传址传值?

为什么区分传值传址,传值调用,传址调用

石墨博客 613

c语言wincc报0069错误,大侠们,帮忙看看这段WINCC中C动作的源代码为什么不能编译通过?...

代码内容:#include"apdefap.h"voidOnLButtonDown(char*lpszPictureName,char*lpszObjectName,char*lpszPropertyName,UINTnFlags,intx,inty){#pragmacode("useadmin.dll")#include"PWRT_API.H"#pragmacod...

weixin_39989862的博客 1593

为什么编程语言的都要定义数据类型

对于一个程序员来讲,写代码的第一件是请,恐怕就是需要定义一些数据类型。而程序本身,就是对这些数据类型进行操作,有没有人思考过,为什么每种语言编写的程序,开始都需要定义数据类型呢? 以下面的C代码为例,我们来说明这个问题: #include&lt;stdio.h&gt; int main() { int a=100; in...

weixin_33755649的博客 3703

C语言 输入两个整数,交换两个数的值

从那键盘上输入两个整数a和b,交换两个数的值。分别输出交换前及交换后的结果。

weixin_53815931的博客 3615
上一篇: Spring scope
下一篇: jQuery对象与DOM对象区别 (每都学一点知识,就少些一行代码)
yy_2011
博客等级 码龄16年 5粉丝 45原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值