百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>数据库> MySQL中CHAR和VARCHAR的区别
分享文章到:

MySQL中CHAR和VARCHAR的区别

发布时间:09/01 来源:未知 浏览: 关键词:
本篇文章为大家介绍VARCHAR和CHAR是两种最主要的字符串类型。以及这两个字符串类型的运用场景和区别。 前述

VARCHAR和CHAR是两种最主要的字符串类型。不幸的是,很难精准地解释这些值是怎么存储在磁盘和内存中的,由于这跟存储引擎的概括实现有关。下面的描述假如运用的存储引擎是InnoDB和/或者MyISAM。要是运用的不是这两种存储引擎,请参照 所运用的存储引擎的文档。

先看看VARCHAR和CHAR值平常在磁盘上怎么存储。请注意,存储引擎存储CHAR或者VARCHAR值的方式在内存中和在磁盘上可能不同,所以MySQL办事器从存储引擎读出的值可能需要转换为另一种存储格局。

VARCHAR类型

VARCHAR类型用于存储可变长字符串,是最常见的字符串数据类型。它比定长类型更节俭空间,由于它仅运用须要的空间(例如,越短的字符串运用越少的空间)。有一种状况例外,要是MySQL表运用ROW_FORMAT=FIXED新建的话,每一行都会运用定长存储,这会很浪费空间。

VARCHAR需要运用1或2个额外字节记载字符串的长度:要是列的最大长度小于或等于255字节,则只运用1个字节表示,不然运用2个字节。假如采纳latin1字符集,一个VARCHAR(10)的列需要11个字节的存储空间。VARCHAR(1000)的列则需要1002个字节,由于需要2个字节存储长度信息。

VARCHAR节俭了存储空间,所以对机能也有帮忙。但是,因为行是变长的,在UPDATE时可能使行变得比本来更长,这就致使需要做额外的工作。要是一个行占用的空间增长,而且在页内没有更多的空间可以存储,在这种状况下,不一样的存储引擎的处置方式是不同的。例如,MyISAM会将行拆成不一样的片段存储,InnoDB则需要破裂页来使行可以放进页内。其他一些存储引擎或许从不在原数据位置更新数据。

VARCHAR适用状况

下面这些状况下适用VARCHAR是合适的:

字符串列的最大长度比均匀长度大许多

列的更新很少,所以碎片不是题目

运用了像UTF-8这样复杂的字符集,每个字符都运用不一样的字节数进行存储

CHAR类型

CHAR类型是定长的:MySQL总是依据定义的字符串长度分配脚够的空间。当存储CHAR值时,MySQL会删除所有的末尾空格。CHAR值会依据需要采纳空格进行添补以利便比拼。

CHAR适合存储很短的字符串,或者所有值都接近统一个长度。例如,CHAR非常适合存储密码的MD5值,由于这是一个定长的值。关于时常变动的数据,CHAR也比VARCHAR更好,由于定长的CHAR类型不容易发生碎片。关于非常短的列,CHAR比VARCHAR在存储空间上也更有效率。例如用CHAR(1)来存储只要Y和N的值,要是采纳单字节字符集只需要一个字节,但是VARCHAR(1)却需要两个字节,由于还有一个记载长度的额外字节。

测试

下面通过例子来概括注明CHAR与VARCHAR行为上的不一样,第一,我们新建一张只要一个CHAR(10)字段的表,而且往里面插入一些值:

CREATE TABLE char_test
(
    char_col CHAR(10)
);
 
INSERT INTO char_test 
VALUES
    ('string1').
    ('  string2').
    ('string3  ');

当我们检索这些值的时候,会发明string3末尾的空格被截断了。

SELECT CONCAT("'", char_col, "'")
FROM char_test;

施行效果:

要是用VARCHAR(10)字段存储雷同的值,可以得到如下效果:

CREATE TABLE varchar_test
(
    varchar_col VARCHAR(10)
);
 
INSERT INTO varchar_test 
VALUES
    ('string1').
    ('  string2').
    ('string3  ');
 
SELECT CONCAT("'", varchar_col, "'")
FROM varchar_test;

施行效果

VARCHAR(5)与VARCHAR(200)的区别

我们倘使用VARCHAR(5)和VARCHAR(200)来存储'hello',我们晓得这两者的空间开销是同样的。那么我们可以让VARCHAR的长度始终维持很大吗?运用更短的列有什么优势吗?

事实证实有很大的优势。更长的列会耗损更多的内存,由于MySQL平常会分配牢固大小的内存块来保留内部值。尤为是运用内存暂时表进行排序或操纵时会特殊糟糕。在应用磁盘暂时表进行排序时也一样糟糕。

所以最佳的战略是只分配真正需要的空间。

总结

当我们为字符串类型的字段拔取类型的时候,推断该拔取VARCHAR还是CHAR,我们可以从下列几个方面来考虑:

该字段数据集的均匀长度与最大长度可否相差很小,若相差很小优先考虑CHAR类型,反之,考虑VARCHAR类型。

若字段存储的是MD5后的哈希值,或一些定长的值,优先拔取CHAR类型。

若字段时常需要更新,则优先考虑CHAR类型,因为CHAR类型为定长,因而不容易发生碎片。

关于字段值存储很小的信息,如性别等,优先拔取CHAR类型,由于VARCHAR类型会占用额外的字节保留字符串长度信息。

总之一句话,当我们能够拔取CHAR类型的时候,或者说空间耗损相对并不是影响因素的重点时,尽量拔取CHAR类型,由于在其他方面,CHAR类型都有着或多或少的优势。而当空间耗损成为了很大的影响因素今后,我们则考虑运用VARCHAR类型。

举荐教程:《Mysql教程》

以上就是MySQL中CHAR和VARCHAR的区另外细致内容,更多请关注 百分百源码网 其它相干文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有152人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板