返回顶部
首页 > 资讯 > 数据库 >MySQL之char、varchar类型简析
  • 216
分享到

MySQL之char、varchar类型简析

mysql数据库java 2023-08-18 14:08:17 216人浏览 安东尼
摘要

我们都知道,Mysql中关于字符,有char和varchar两种常用的类型,可能在平时的使用过程中,大家不会去关心这两种类型的区别,只是会用就可以了,或者说看到过一些它们的区别,但是没有时间去测试,今天有时间了,我将这两种类型的具体情况实验

我们都知道,Mysql中关于字符,有char和varchar两种常用的类型,可能在平时的使用过程中,大家不会去关心这两种类型的区别,只是会用就可以了,或者说看到过一些它们的区别,但是没有时间去测试,今天有时间了,我将这两种类型的具体情况实验一把,让大家直观感受下,纯属分享,大神请绕道。

​ 先说说理论吧。

​ char类型为固定长度的字符串,比如说char(10),它定义了指定的字符串长度最大为10个字符,如果你现在输入一个字符串为’12345678’,那么它在char类型中到底会占用多少个字符呢?答案是10个,后面缺少的2个字符,mysql会自动补充为空值,然后进行存放。在取这个记录的时候,char类型的会使用trim()函数去掉多余的空格,所以我们看到的还是8个字符的记录。当输入的字符长度大于最大的长度时,Mysql会自动报错。

​ varchar类型是长度可变的字符串,varchar(M)表示最大长度是M个字符,varchar的最大实际长度由最大的行的大小和使用的字符集确定。例如varchar(50)定义了一个最大长度为50的字符串,如果插入的字符串只有20个字符,那么实际存储的字符串具有21个字符,因为varchar会自动包含一个字符串结束字符。varchar在值保存和检索时,尾部的空格仍然保留。

​ 介绍完概念,我们来看具体的实践过程,本文中使用的测试版本为MySQL5.7.22版本。

1.测试char的trim()功能

​ 首先创建一个表,这个表里面包含两个字段,d_char和d_varchar,设定初始的字符长度都为4,如下:

图片

查看一下,

图片

此时,我们插入两条记录,每条记录都是’ab ',注意,ab后面有2个空格,

图片

然后我们使用mysql里面的concat函数进行字符连接,给每条记录的左右分别添加小括号,

图片

此时我们可以看到,d_char的ab后面的空格被取消掉了,而d_varchar后面的空格还依旧存在。

2.测试两种字符类型的最大长度

首先看看char的最大长度,我们设置的值为256,结果如下

图片

所以,char类型的长度取值范围为0~255个字符

上面提到了varchar的最大实际长度由最大的行的大小和使用的字符集确定,这里我们进行实验:

图片

可以看到,字符集不一样,最后的max的值也是不一样的,

utf8模式下是0~21845,一个字符占三个字节,最多能存 21844 个字符

latin1模式下是0~65535,一个字符占一个字节,最多能存放 65532 个字符

gbk模式下是0~32767,一个字符占两个字节,最多能存 32766 个字符

若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。

可能这里有人要问了,为什么最大值是32767,而最多只能放32766个字符呢?

举两个例说明一下实际长度的计算。

a) 若一个表只有一个varchar类型,如定义为

create table t4(c varchar(N)) charset=gbk;

则此处N的最大值为(65535-1-2)/2= 32766 个字符。

减1的原因是实际行存储从第二个字节开始’;

减2的原因是varchar头部的2个字节表示长度;

除2的原因是字符编码是gbk。

b) 若一个表定义为

create table t4(c int, c2 char(30), c3 varchar(N)) charset=utf8;

则此处N的最大值为 (65535-1-2-4-30*3)/3=21812

减1和减2与上例相同;

减4的原因是int类型的c占4个字节;

减30*3的原因是char(30)占用90个字节,编码是utf8。

如果被varchar超过上述的b规则,被强转成text类型,则每个字段占用定义长度为11字节,当然这已经不是“varchar”了。

则此处N的最大值为 (65535-1-2-4-30*3)/3=21812

3.MySQL的字段长度模式

​ 字段长度的模式分为严格模式和不严格模式,在严格模式下,如果我们想给一个字段中插入一个大于规定长度的字符串,MySQL会给出错误提示,例如我们的表:

图片

​ 当我们插入一个大于4字符的记录时,

图片

​ 如果在非严格模式下,mysql会自动截断超出最大长度的字符,

图片

​ 上面的操作是,我们先把字段模式改为非严格模式,然后查询更改,确保更改生效,接着我们插入’abcde’字符串,发现它可以被成功执行,但是包含两个警告,查看警告可以发现,一些数据被截断了,

图片

​ 实验部分的内容基本就完成了,这里我们进行几点分析:

1.MySQL为什么要设置这两种类型?它们各自有什么优点?

​ char是固定长度的,它的存取速度比varchar快,方便程序的存储于查找,但是它需要浪费一定的空间,可以看做是一种以空间换时间的方法。

​ 而varchar的特点是可变长,当定义一个varchar(10)而只存入了4个字符,此时varchar会直接将字符记录的长度变为4,从而节省空间,它可以看做是一种用时间换取空间的方法。

​ char的存储方式是,对英文字符(ASCII)占用1个字节,对一个汉字占用两个字节;而varchar的存储方式是,对每个英文字符占用2个字节,汉字也占用2个字节,两者的存储数据都非unicode的字符数据。

2.两种类型适应的情况分析

关于char:

​ CHAR适合存储很短的字符串,或者所有值都接近同一个长度。

​ 对于经常变更的数据,CHAR也比VARCHAR更好,因为定长的CHAR类型不容易产生碎片。

对于非常短的列,CHAR在存储空间上也更有效率。例如用char(1)来存储只有Y和N的值,只需要一个字节,但是varchar却需要两个字节,因为还一个记录长度的额外字节。

关于varchar

​ VARCHAR类型用于存储可变长字符串,是最常见的字符串数据类型。它比定长类型 更节省空间,因为它仅使用必要的空间(例如,越短的字符串使用越少的空间)。

​ VARCHAR节省了存储空间,所以对性能也有帮助。但是,由于行是变长的,在UPDATE时可能使行变得比原来更长,这就导致需要做额外的工作。如果一个行占用 的空间增长,并且在页内没有更多的空间可以存储,在这种情况下,不同的存储引擎的处理方式是不一样的。例如,MyISAM会将行拆成不同的片段存储,InnoDB 则需要分裂页来使行可以放进页内。

​ VARCHAR需要使用1或2个额外字节记录字符串的长度:如果列的最大长度小于或等于255字节,则只使用1个字节表示,否则使用2个字节。假设采用latinl字符集 ,一个varchar(10)的列需要11个字节的存储空间。varchar(1000)的列则需要1002个字节,因为需要2个字节存储长度信息。

适用情况:

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

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

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

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

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

关于MySQL之char、varchar,你学废了么?


真诚地邀请您加入我们的大家庭.
在这里不仅有技术知识分享,还有博主们之间的互帮互助
不定期发红包,每月更有抽奖环节,游戏机和实体书相赠(包邮)
让我们抱团取暖,抱团内卷.打造美好C站.期待您的加入.
备注 : CSDN-xxxxxx (xxxxxx代表你csdn的昵称)

来源地址:https://blog.csdn.net/qq_44590469/article/details/126623379

您可能感兴趣的文档:

--结束END--

本文标题: MySQL之char、varchar类型简析

本文链接: https://lsjlt.com/news/374054.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL之char、varchar类型简析
    我们都知道,MySQL中关于字符,有char和varchar两种常用的类型,可能在平时的使用过程中,大家不会去关心这两种类型的区别,只是会用就可以了,或者说看到过一些它们的区别,但是没有时间去测试,今天有时间了,我将这两种类型的具体情况实验...
    99+
    2023-08-18
    mysql 数据库 java
  • MySQL字符之char、varchar类型简析
    目录前言1.测试char的trim()功能2.测试两种字符类型的最大长度3.mysql的字段长度模式总结前言 我们都知道,MySQL中关于字符,有char和varchar两种常用的类型,可能在平时的使用过程中,...
    99+
    2024-04-02
  • MySQL CHAR和VARCHAR数据类型介绍
    CHAR类型是固定长度的,长度范围为0到255。如果存储的值不覆盖字段长度,存储数据的其他的部分会在值的右边自动添加空格。 VARCHAR字段中的值是可变长度的字符串,长度范围为0到65535。VARC...
    99+
    2024-04-02
  • MySQL中varchar和char类型的区别
    目录前述VARCHAR类型VARCHAR适用情况CHAR类型测试VARCHAR(5)与VARCHAR(200)的区别总结前述 VARCHAR和CHAR是两种最主要的字...
    99+
    2024-04-02
  • MySQL中varchar和char类型有什么区别
    本篇内容介绍了“MySQL中varchar和char类型有什么区别”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!VARCHAR类型VARCH...
    99+
    2023-06-25
  • 存储之道:MySQL 中的字符串数据类型之 CHAR 与 VARCHAR
    文章目录 参考描述CHAR 与 VARCHAR常见的字符串数据类型权衡 CHAR 中尾随的空白字符固定字符长度PAD_CHAR_TO_FULL_LENGTH开启 PAD_CHAR_T...
    99+
    2023-10-22
    数据库 CHAR VARCHAR 尾随空白字符 MySQL
  • MySQL字符串类型中VARCHAR和CHAR的区别
    前述VARCHAR和CHAR是两种最主要的字符串类型。不幸的是,很难精确地解释这些值是怎么存储在磁盘和内存中的,因为这跟存储引擎的具体实现有关。下面的描述假设使用的存储引擎是InnoDB和/或者MyISAM...
    99+
    2024-04-02
  • Java数据类型之细讲char类型与编码关系
    目录一、开头二、整形三、Byte.toUnsignedInt四、Integer.divideUnsigned五、Integer.remainderUnsigned六、Long.div...
    99+
    2024-04-02
  • mysql varchar类型求和实例操作
    有的小伙伴在学习数据库的时候,创建表结构的时候不小心把某字段设置成了varchar但是在统计求和的时候就傻眼了,接下来跟着小编学习一下,不用改该列数据类型也能求和的方法吧! 1、打开 数据库连接客户端Nav...
    99+
    2024-04-02
  • mysql如何将varchar转换为int类型
    这篇文章主要介绍“mysql如何将varchar转换为int类型”,在日常操作中,相信很多人在mysql如何将varchar转换为int类型问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望...
    99+
    2024-04-02
  • mysql时间是varchar类型进行比较
    一般情况下数据库时间类型都是以datetime、timestamp等格式进行存储的 , 但有时也会出现varchar类型 , 这个时候在sql中比较时间类型就需要用到函数STR_TO_DATE(str, format);...
    99+
    2023-04-21
    mysql时间varchar类型比较 mysql varchar比较
  • MySQL中varchar字段类型如何设置
    在MySQL中,可以通过以下方式设置varchar字段类型: CREATE TABLE table_name ( column_...
    99+
    2024-05-23
    mysql
  • mysql中number转成varchar类型怎么实现
    在MySQL中,可以使用CAST函数将number类型转换为varchar类型。下面是一个示例: SELECT CAST(n...
    99+
    2024-04-09
    mysql
  • Java数据类型之细讲char类型与编码关系是什么
    小编给大家分享一下Java数据类型之细讲char类型与编码关系是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、开头Java是一种强类型的语言,这意味着必须...
    99+
    2023-06-15
  • mysql中怎么测试varchar类型最大长度
    本篇文章为大家展示了mysql中怎么测试varchar类型最大长度,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 1.先看字符集为la...
    99+
    2024-04-02
  • 解决MySQL Varchar 类型尾部空格的问题
    目录背景原因详解char 和 varchar 的区别varchar 对于尾部空格的处理确定排序规则的 pad 属性背景 近期发现系统中某个输入框里如果输入xxx+空格的时候会出现异常...
    99+
    2024-04-02
  • Mysql中varchar类型一些需要注意的地方
    varchar的存储规则 0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节)。 5.0版本以上,varchar(20),指的是20字符,无论...
    99+
    2022-05-27
    Mysql varchar类型 Mysql varchar类型注意的地方
  • Python数据类型简介之numpy
    本篇文章给大家带来了关于Python的相关知识,其中主要整理了numpy数据类型的相关问题,包括了numpy的基本数据类型、numpy自定义复合数据类型、使用ndarray保存日期数据类型等等内容,下面一起来看一下,希望对大家有帮助。【相关...
    99+
    2022-08-08
    python
  • MySQL数据库中varchar数据类型有哪些特点
    这篇文章主要介绍MySQL数据库中varchar数据类型有哪些特点,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!VARCHAR(M)是一种比CHAR更加灵活的数据类型,同样用...
    99+
    2024-04-02
  • MySQL中varchar类型的字段默认值设置方式
    目录mysql varchar字段默认值设置Mysql Varchar 类型为什么默认设置 255Mysql5.6.xMysql5.7.x总结MySQL varchar字段默认值设置 最近开始给项目设计数据库,遇到一个可...
    99+
    2023-10-19
    MySQL varchar类型 MySQL字段默认值 varchar类型的字段默认值
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作