mysql数据类型区别之char与varchar

Posted: 2009年7月15日星期三
也许在使用mysql创建数据表时经常有这样的疑问,是选择char还是varchar,text还是blob数据类型呢?其实选择什么都行,都能完成我们的需求,但是,选择好合适的数据类型不仅能节约磁盘空间还能提高访问速度达到mysql调优的目的。
1、char和varchar
char和varchar都能存储字符串,其中char是固定长度,varchar是可变长度字符类型。下面通过一个实例来来说明两者的数据存储的区别

mysql> create table c(c char(4), v varchar(4));
Query OK, 0 rows affected (0.03 sec)
mysql> insert into c values('ab ', 'ab ');
Query OK, 1 row affected(0.00 sec)

通过在mysql函数cancat,在字符的末尾添加字符的功能可以看出他的存储情况

mysql> select concat(c, '+'), concat(v, '+') from c;
+----------------+----------------+
| concat(c, '+') | concat(v, '+') |
+----------------+----------------+
| ab+ | ab + |
+----------------+----------------+
1 row in set (0.00 sec)

从上可以看出在mysql检索时通常会删除掉char数据类型的空格。
由于char是固定长度,所以他的处理速度比varchar要快得多,但是他比较消耗存储空间,程序还得考虑他末尾的空格问题对于那些长度变化不大,并且对查询速度有较高要求的数据可以考虑使用char数据类型来存储。
下面来说说在不同的存储引擎条件下两者的使用原则
1、myisam存储引擎:建议使用固定长度的char数据类型来代替可变长度的varchar数据类型
2、memory存储引擎:都使用固定长度的数据行存储,因此使用char或varchar都没有关系,两者都被当作char数据类型进行处理
3、innodb存储引擎:建议使用可变的varchar数据类型,理由:对于innodb数据表,内部的行存储格式没有区分固定长度和可变长度列(所有的数据行都指向数据列值的头指针),因此使用固定长度的char数据类型不一定比使用可变数据长度的数据类型性能好,因而,主要的性能因素是数据行使用的存储总量,由于char数据列占用的空间比varchar数据列要大,因此varchar存储的空间要小,对于磁盘io来说越小的空间,处理数据能力越强。

0 评论: