MySQL数据库中CHAR与VARCHAR之争[Linux安全]
本文“MySQL数据库中CHAR与VARCHAR之争[Linux安全]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
在数据库中,字符型的数据是最多的,可以占到整个数据库的80%以上.为此精确处理字符型的数据,关于提高数据库的性能有很大的作用.在字符型数据中,用的最多的就是Char与Varchar两种范例.前面的是固定长度,此背面的是可变长度.目前我们需求考虑的是,在什么情形下利用Char字符型数据,什么情形下采取Varchar字符型数据.在这部份内容中,我就跟大家来探究一下这个话题.
1、VARCHAR与CHAR字符型数据的差别
在MySQL数据库中,用的最多的字符型数据范例就是Varchar和Char..这两种数据范例固然都是用来存放字符型数据,但是无论从构造还是从数据的保存方法来看,二者相差很大.并且其具体的实现方法,还依靠与存储引擎.我这里就以大家最常用的MYISAM存储引擎为例,谈谈这两种数据范例的差别.在后续倡议中,也是针对这种存储范例而言的.
这里首先需求懂得的一点是,这两种数据范例,无论采取哪一种存储惹起,系统存储数据的方法都是差别的.恰是因为如此,我们才有必要研究二者的差别.然后在符合的情形下,采获得当的方法.理解这一点之后,我们再来看后续的内容.
Varchar常常用来保存可变长度的字符串.简单的说,我们只是给其固定了一个最大值,然后系统会按照实际存储的数据量来分配符合的存储空间.为此相比CHAR字符数据而言,其可以比固定长度范例占用更少的存储空间.不过在实际工作中,由于某系特别的缘由,会在这里设置例外.如管理员可以按照需求指定ROW_FORMAT=FIXED选项.操纵这个选项来成立MyISAM表的话,系统将会为每一行利用固定长度的空间.此时会造成存储空间的损耗.普通情形下,VARCHAR数据范例可以节俭磁盘空间,为此常常认为其可以晋升数据库的性能.不过这里需求注意的是,这常常是一把双刃剑.其在晋升性能的同时,常常也会产生一些副作用.如因为其长度是可变的,为此在数据举行更新时大概会招致一些额外的工作.如在更改前,其字符长度是10位(Varchar规定的最长字符数假定是50位),此时系统就只给其分配10个存储的位置(假定不考虑系统自身的开销).更改后,其数据量到达了20位.由于没有超越最大50位的限制,为此数据库还是答应其存储的.只是其原先的存储位置已经无法满意其存储的需求.此时系统就需求举行额外的操作.如按照存储引擎差别,有的会采取拆分机制,而有的则会采取分页机制.
CHAR数据范例与VARCHAR数据范例差别,其采取的是固定长度的存储方法.简单的说,就是系统总为其分配最大的存储空间.当数据保存时,即便其没有到达最大的长度,系统也会为其分配这么多的存储空间.明显,这种存储方法会造成磁盘空间的浪费.这里笔者需求提醒的一点是,当字符位数不足时,系统并不会采取空格来填充.相反,假如在保存CHAR值的时刻,假如其背面有空值,系统还会自动过滤其空格.而在举行数据对比时,系统又会将空格填充到字符串的末尾.
明显,VARCHAR与CHAR两种字符型数据范例相比,最大的差别就是前者是可变长度,此后者则是固定长度.在存储时,前者会按照实际存储的数据来分配终究的存储空间.此后者则不管实际存储数据的长度,都是按照CHAR规定的长度来分配存储空间.这能否意味着CHAR的数据范例劣于VARCHAR呢?其实不然.不然的话,就没有必要存在CHAR字符范例了.固然VARCHAR数据范例可以节俭存储空间,提高数据处理的效率.但是其可变长度带来的一些负面效应,有时刻会抵消其带来的上风.为此在某些情形下,还是需求利用Char数据范例.
2、项目倡议
按照上面的解析,我们知道VARCHAR数据范例是一把双刃剑,其在带来性能晋升的同时,也大概会存在着一些额外的损耗.我们在评价毕竟是利用VARCHAR数据范例还是采取CHAR数据范例时,就需求举行均衡.在实际项目中,我们会考量以下情形.
一是按照字符的长度来判断.如某个字段,像人的名字,其最长的长度也是有限的.如我们给其分配18个字符长度便可.此时固然每个人的名字长度有大概差别,但是即便为其分配了固定长度的字符范例,即18个字符长度,最后浪费的空间也不是很大.而假如采取NVARCHAR数据范例时,万一今后需求改名,而原先的存储空间不足用来包容新的值,反而会造成一些额外的工作.在这种情形下,举行均衡时,会认为采取CHAR固定长度的数据范例更好.在实际项目中,假如某个字段的字符长度对比短此时普通是采取固定字符长度.
二是考虑其长度的能否相近.假如某个字段其长度固然对比长,但是其长度老是近似的,如普通在90个到100个字符之间,乃至是相同的长度.此时对比合适采取CHAR字符范例.对比典型的利用就是MD5哈希值.当操纵MD5哈希值来存储用户密码时,就非常利用采取CHAR字符范例.因为其长度是相同的.别的,像用来存储用户的身份证号码等等,普通也倡议利用CHAR范例的数据.
别的请大家考虑一个问题,CHAR(1)与VARCHAR(1)两这个定义,会有什么辨别呢?固然这两个都只可以用来保存单个的字符,但是VARCHAR要比CHAR多占用一个存储位置.这主如果因为利用VARCHAR数据范例时,会多用1个字节用来存储长度信息.这个管理上的开销CHAR字符范例是没有的.
三是从碎片角度举行考虑.利用CHAR字符型时,由于存储空间都是一次性分配的.为此某个字段的内容,其都是存储在一同的.单从这个角度来说,其不存在碎片的困扰.而可变长度的字符数据范例,其存储的长度是可变的.当其更改前后数据长度不一致时,就不可避免的会呈现碎片的问题.故利用可变长度的字符型数据时,数据库管理员要时不时的对碎片举行整理.如履行数据库导出导入功课,来消除碎片.
四是即便利用Varchar数据范例,也不可以太过于大方.这是什么意思呢?如目前用户需求存储一个地址信息.按照评价,只要利用100个字符便可以了.但是有些数据库管理员会认为,反正Varchar数据范例是按照实际的需求来分配长度的.还不如给其大一点的呢.为此他们大概会为这个字段一次性分配200个字符的存储空间.这VARCHAR(100)与VARCHAR(200)真的相同吗?后果能否定的.固然他们用来存储90个字符的数据,其存储空间相同.但是关于内存的损耗是差别的.关于VARCHAR数据范例来说,硬盘上的存储空间固然都是按照实际字符长度来分配存储空间的,但是关于内存来说,则不是.当时利用固定大小的内存块来保存值.简单的说,就是利用字符范例中定义的长度,即200个字符空间.明显,这关于排序大概暂时表(这些内容都需求通过内存来实现)功课会产生对比大的不利影响.所以假如某些字段会触及到文件排序大概基于磁盘的暂时表时,分配VARCHAR数据范例时仍旧不可以太过于大方.还是要评价实际需求的长度,然后挑选一个最长的字段来设置字符长度.假如为了考虑冗余,可以留10%左右的字符长度.千万不能认为其为按照实际长度来分配存储空间,而随便的分配长度,大概说干脆利用最大的字符长度.
以上是“MySQL数据库中CHAR与VARCHAR之争[Linux安全]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |