MySQL中char、varchar和nvarchar的区别
⼀、char和varchar的区别
char是固定长度的,⽽varchar会根据具体的长度来使⽤存储空间,另外varchar需要⽤额外的1-2个字节存储字符串长度。
1). 当字符串长度⼩于255时,⽤额外的1个字节来记录长度
2). 当字符串长度⼤于255时,⽤额外的2个字节来记录长度
⽐如char(255)和varchar(255),在存储字符串"hello world"时,char会⽤⼀块255个字节的空间放那个11个字符;⽽varchar就不会⽤255个,它先计算字符串长度为11,然后再加上⼀个记录字符串长度的字节,⼀共⽤12个字节存储,这样varchar在存储不确定长度的字符串时会⼤⼤减少存储空间。
⼆、varchar和nvarchar的区别
1. varchar(n):长度为n个字节的可变长度且⾮Unicode的字符数据。n必须是⼀个介于1和8,000之间的数值。存储⼤⼩为输⼊数据的字节的实际长度
2. nvarchar(n):包含n个字符的可变长度Unicode字符数据。n的值必须介于1与4,000之间。字节的存储⼤⼩是所输⼊字符个数的两倍。所输⼊的数据字符长度可以为零。
三、char和varchar的使⽤场景
1. 从字符长度的⾓度考虑:
(1). 长度较短的字段,使⽤char。如门牌号:101,201,...
(2). 固定长度的字段,使⽤char。如性别、⾝份证号、⼿机号等。(因为数据都是固定长度,varchar根据长度动态存储的特性就没作⽤了,⽽且还要占⼀个字节来存储长度)
varchar2最大长度(3). 字段的长度是否相近,如果某个字段其长度虽然⽐较长,但是其长度总是近似的,如⼀般在90个到100个字符之间,甚⾄是相同的长度。此时⽐较适合采⽤CHAR字符类型。
2. 从碎⽚⾓度考虑:
使⽤CHAR时,由于存储空间都是⼀次性分配的。从这个⾓度来讲,不存在碎⽚的困扰。⽽使⽤varchar时,因为存储的长度是可变的,当数据长度在更改前后不⼀致时,就不可避免地会出现碎⽚的问题。故使⽤varchar时,数据库管理员要时不时的对碎⽚进⾏整理。如执⾏数据库导出导⼊作业来消除碎⽚。
3. 即使使⽤Varchar数据类型,也不能够太过于慷慨。
虽然varchar可以⾃动根据长度调整存储空间,但是varchar(100)和varchar(255)还是有区别的:
假设它们都存储了90个字符的数据,那么它们在磁盘上的存储空间是相同的(硬盘上的存储空间是根据实际字符长度来分配存储空间的)。但对于内存来说,则不是这样的,内存是使⽤varchar中定义的长度(这⾥为100或255)的内存块来保存值。
所以如果某些字段会涉及到⽂件排序或者基于磁盘的临时表时,分配VARCHAR的长度时仍然不能过于慷慨,需要评估实际需要的长度,然后设置⼀个合适的长度,不能随意设置长度。
四、varchar和nvarchar的使⽤场景
1. nvarchar适⽤中⽂和其他字符,其中N表⽰Unicode编码,可以解决多语⾔之间的转换问题