Char属于固定长度的字符类型,而varchar属于可变长的字符类型。

下表将各种字符串值保存到char(4)和varchar(4)列后的结果,说明了char和varchar之间的差别

Char(4)

存储需求

Varchar (4)

存储需求

‘’

‘     ’

4字符节

‘’

1字符节

‘ab’

‘ab   ’

4字符节

‘ab ’

3字符节

‘abcd’

‘abcd’

4字符节

‘abcd’

5字符节

‘abcdefgh’

‘abcd’

4字符节

‘abcd’

5字符节

请注意,最后一行的值只适用于非“严格模式”时,如果mysql运行在严格模式,超过列长度的值将不会保存,并且会出现错误提示。

从char(4)和varchar(4)列检索的值并不总是相同,因为检索事从char列删除了尾部的空格。

由于char是固定长度的,所以他的处理速度比varhcar快的多,但是其缺点是浪费存储空间,程序需要对尾行空格进行处理,所以对于哪些长度变化不大并且对查询速度要求较高的数据可以考虑使用char类型存储

另外,随着mysql版本的不断升级,varchar数据类型的性能也在不断改进并提高,所以在许多应用中,varvhar类型被更多使用

在mysql中,不同的存储引擎对char和varchar的使用原则有所不同,这里简单概括若下:

Myisam存储引擎:建议使用固定长度的数据列代替可变长的数据列

Memory存储引擎:目前都使用固定长度的数据行存储,因此无论使用char varchar列都没有关系,两者都是作为char类型处理

Innodb存储引擎:建议使用varchar类型。对于innodb数据表,内部的行存储格式没有区分固定长度和可变长度列(所有数据行都使用指向数据列值的头指针),因此在本质上,使用固定长度的char列不一定比使用可变长度varchar的性能要好,因此,主要的性能因素是数据行使用的存储总量,由于char平均占用的空间多于varchar,因此使用varchar来最小化需要处理的数据行的存储总量和磁盘I/O是比较好的。

上面来自网易《深入浅出MYSQL数据库开发、优化与管理维护》

以下是测试过程,针对MYISAM,5.5.19 MySQL Community Server (GPL):

表结构

插入100万条记录

DELIMITER $$

USE `test`$$

DROP PROCEDURE IF EXISTS `test1`$$

CREATE DEFINER=`admin`@`%` PROCEDURE `test1`()
BEGIN
    DECLARE i INT DEFAULT 1;
   
    WHILE i <= 1000000 DO
   
    INSERT INTO test1 VALUES (i,i,'abc');
   
    SET i=i+1;
   
    END WHILE;
  
    END$$

DELIMITER ;

DELIMITER $$

USE `test`$$

DROP PROCEDURE IF EXISTS `test2`$$

CREATE DEFINER=`admin`@`%` PROCEDURE `test2`()
BEGIN
    DECLARE i INT DEFAULT 1;
   
    WHILE i <= 1000000 DO
   
    INSERT INTO test2 VALUES (i,i,'abc');
   
    SET i=i+1;
   
    END WHILE;
  
    END$$

DELIMITER ;

[root@vm01 test]# ll -h |grep test
-rw-rw---- 1 mysql mysql 8.5K 04-01 17:16 test1.frm
-rw-rw---- 1 mysql mysql  19M 04-01 17:20 test1.MYD
-rw-rw---- 1 mysql mysql  17M 04-01 17:20 test1.MYI
-rw-rw---- 1 mysql mysql 8.5K 04-01 17:16 test2.frm
-rw-rw---- 1 mysql mysql  20M 04-01 17:26 test2.MYD
-rw-rw---- 1 mysql mysql  12M 04-01 17:26 test2.MYI

char表数据+主键+索引=19M+17M=36M

varchar表数据+主键+索引=20M+12M=32M

=====================================================================

下面测试不带索引的。

插入100万条记录

-rw-rw---- 1 mysql mysql 8.5K 04-01 17:44 test1.frm
-rw-rw---- 1 mysql mysql  19M 04-01 18:01 test1.MYD
-rw-rw---- 1 mysql mysql 9.8M 04-01 18:01 test1.MYI
-rw-rw---- 1 mysql mysql 8.5K 04-01 17:44 test2.frm
-rw-rw---- 1 mysql mysql  20M 04-01 18:04 test2.MYD
-rw-rw---- 1 mysql mysql 9.9M 04-01 18:04 test2.MYI

char表数据+主键=19M+9.8M=28.8M

varchar表数据+主键=20M+9.9M=29.9M

=====================================================================

下面测试不带主键和索引的。

插入100万条记录

[root@vm01 test]# ll -h | grep test
-rw-rw---- 1 mysql mysql 8.5K 04-01 18:08 test1.frm
-rw-rw---- 1 mysql mysql  19M 04-01 18:10 test1.MYD
-rw-rw---- 1 mysql mysql 1.0K 04-01 18:10 test1.MYI
-rw-rw---- 1 mysql mysql 8.5K 04-01 18:08 test2.frm
-rw-rw---- 1 mysql mysql  20M 04-01 18:11 test2.MYD
-rw-rw---- 1 mysql mysql 1.0K 04-01 18:11 test2.MYI

char表数据=19M

varchar表数据=20M

=====================================================================

总结:针对MYISAM引擎,如果使用varchar字符类型,增加索引的容量要小于不加索引的。

转载于:https://blog.51cto.com/liang3391/823326

char与varchar区别(MYISAM)相关推荐

  1. mysql的binary、char、varchar区别

    mysql的binary.char.varchar区别 分类: Mysql/postgreSQL 2013-09-24 18:11:46 char使用固定长度的空间进行存储,char(4)存储4个字符 ...

  2. char和varchar区别

    char是一种固定长度的类型,无论储存的数据有多少都会固定长度,如果插入的长度小于定义长度,则可以用空格进行填充.而varchar是一种可变长度的类型,当插入的长度小于定义长度时,插入多长就存多长. ...

  3. mysql char 二进制_SQL:char 和 varchar、binary 和 varbinary、二进制字符串、严格模式、汉字编码方式...

    一.char 和 varchar 区别 1.定长和变成 char:定长,长度固定:varchar:变长,长度可变: 当插入的字符串长度小于定义长度时,则会以不同的方式来处理,如char(10),表示存 ...

  4. mysql中char与varchar的区别分析(补充一句,int和integer没区别)

    转自:http://www.jb51.net/article/23575.htm 在mysql教程中char与varchar的区别呢,都是用来存储字符串的,只是他们的保存方式不一样罢了,char有固定 ...

  5. mysql数据库varchar的区别_MySQL数据库char与varchar的区别分析及使用建议

    在数据库中,字符 型的数据是最多的,可以占到整个数据库的80%以上.为此正确处理字符型的数据,对于提高数据库的性能有很大的作用.在字符型数据中,用的最多的就是 Char与Varchar两种类型.前面的 ...

  6. mysql中char与varchar的区别分析

    原文网址:http://www.jb51.net/article/23575.htm mysql中char与varchar的区别分析 作者: 字体:[增加 减小] 类型:转载 在mysql教程中cha ...

  7. mysql数据库varchar_MySQL数据库char与varchar的区别分析及使用建议

    本文主要介绍了mysql中VARCHAR与CHAR字符型数据的差异以及这两种字符型数据在项目中的使用建议,真心不错.值得一看.小编有种受益匪浅的感觉. 在数据库中,字符 型的数据是最多的,可以占到整个 ...

  8. mysql in varchar_MySQL中char和varchar有啥区别?优缺点是啥?

    在mysql教程中char与varchar的区别呢,都是用来存储字符串的,只是他们的保存方式不一样罢了,char有固定的长度,而varchar属于可变长的字符类型. char与varchar的区别 c ...

  9. 通过char与varchar的区别,学习可变长的字符类型

    转自http://www.uphtm.com/database/232.html 在mysql教程中char与varchar的区别呢,都是用来存储字符串的,只是他们的保存方式不一样罢了,char有固定 ...

最新文章

  1. thinkphp伪静态(url重写)
  2. oracle表数据转换成sql,ORACLE8I转换数据到SQLSERVER数据库
  3. C++函数模板的重载
  4. NRF24L01模块配置
  5. leetcode题解131-分割回文串
  6. svn提交代码失败提示清理(清理失败并且报错信息乱码解决办法)
  7. 网抑云了是什么意思,网抑云语录有哪些,网抑云网抑云梗表情包
  8. php 请求java_怎么php发送get请求给Java,然后返回想要的具体参数
  9. ROS的学习(十二)用C++写一个简单的发布者
  10. 深信服(SCSA)认证学习—基础知识点二
  11. 项目进度计划表的制作及甘特图的绘制
  12. 食品行业SCM供应链管理平台促进供需协同,赋能产业发展
  13. livezilla账号或密码修改方法
  14. Noip 模拟 7 2018/10/24
  15. 在CentOS8.4中安装OpenFOAM
  16. 操作系统IO模式(理解)
  17. Mimikatz各模块基本用法
  18. Xposed框架初次见面-开发自己的Xposed插件
  19. java用date加一个小时_在Java中添加n个小时到一个date?
  20. 陀螺仪和加速度计MPU6050的单位换算方法

热门文章

  1. java界面编辑教程_java程序设计基础教程第六章图形用户界面编辑.docx
  2. mybatis if test 判断参数_什么?你还在if判断参数?Spring Boot 注解进行参数校验真香...
  3. linux安装交叉编译环境
  4. 工作汇报ppt案例_【赠书】开工大吉!今年一定要干过写PPT的!
  5. linux输入ls后不显示_零基础学习之Linux基础命令小结
  6. java禁止js获取cookie_java中Cookie被禁用后Session追踪问题
  7. tidb 配置mysql数据源_安装tidb数据库
  8. mysql.h 动态编译命令_Linux环境编译动态库和静态库总结
  9. xtrabackup备份脚本
  10. JDK源码解析之 java.lang.ClassLoader