当前位置:  数据库>mysql

mysql中char与varchar的区别分析

    来源: 互联网  发布时间:2014-09-06

    本文导语:  char与varchar的区别 char (13)长度固定, 如'www.' 存储需要空间 12个字符 varchar(13) 可变长 如'www.' 需要存储空间 13字符, 从上面可以看得出来char 长度是固定的,不管你存储的数据是多少他都会都固定的长度。而varchar则处可变长度...

char与varchar的区别

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

varchar(13) 可变长 如'www.' 需要存储空间 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....

    
 
 

您可能感兴趣的文章:

  • MySQL数据库varchar的限制规则说明
  • Mysql varchar大小长度问题介绍
  • MySQL中CHAR和VARCHAR类型演变和详解
  • mysql VARCHAR的最大长度到底是多少
  • MySQL数据类型varchar详解
  • Mysql大表查询优化技巧总结及案例分析
  • MySQL优化分析器 mysqloa
  • php的慢速日志引起的Mysql错误问题分析
  • MySQL抛出Incorrect string value异常分析
  • MySQL DNS的使用过程详细分析
  • Mysql索引会失效的几种情况分析
  • mysql中limit的用法深入分析
  • MYSQL事务回滚的2个问题分析
  • mysql执行时间为负数的原因分析
  • 基于MySQL数据库复制Master-Slave架构的分析
  • 基于mysql事务、视图、存储过程、触发器的应用分析
  • mysql技巧之select count的区别分析
  • MySQL InnoDB和MyISAM数据引擎的差别分析
  • Mysql自带profiling性能分析工具使用分享
  • 基于Mysql存储引擎的深入分析
  • Mysql默认设置的危险性分析第1/2页
  • SQL查询前10条记录(SqlServer/mysql/oracle)的语法分析
  • mysql乱码问题分析与解决方法
  • MYSQL之插入极限分析
  • MySQL字符集的基本类型与统一字符集分析
  • 一个单引号引发的MYSQL性能问题分析
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • mysql获取字符串长度函数(CHAR_LENGTH)
  • mysql中如何查看最大连接数(max_connections)和修改最大连接数
  • 在 linux下输入"mysql"命令,进入mysql命令行,但出现“Can't connetc to local MySQL server thuough socket /var/lib/mysql/mysql.sock
  • Mysql查询错误:ERROR:no query specified原因
  • MySQL 重装MySQL后, mysql服务无法启动
  • php安装完成后如何添加mysql扩展
  • 为什么用linux安装盘安装了mysql后,启动mysql,提示找不到mysql.sock文件?
  • mysql中查询当前正在运行的SQL语句并找出mysql中运行慢的sql语句
  • 請教,在redhat linux7.2+mysql 中,系統提示mysql已啟動,網頁卻不能訪問mysql?
  • Myeclipse中自带Tomcat的JDBC连接池配置(mysql和mssql)
  • 求解释: useradd -g mysql mysql -d /home/mysql -s /sbin/nologin
  • MySQL Workbench的下载安装与使用教程
  • 在Linux内安装了Mysql,无法进入Mysql.
  • php中内置的mysql数据库连接驱动mysqlnd简介及mysqlnd的配置安装方式
  • 怎样在linux终端输入mysql直接进入mysql?
  • VS2012+MySQL+SilverLight5的MVVM开发模式介绍
  • c++中关于#include <mysql/mysql.h>的问题?
  • MySQL索引基本知识
  • mysql -u root mysql 怎么解释
  • Mysql设置查询条件(where)查询字段为NULL
  • mm.mysql那里可以下载?www.mysql.com根本下载不了。谢谢了
  • mysql中字符串和时间互相转换的方法(自动转换及DATE_FORMAT函数)
  • MySQL集群 MySQL Cluster


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3