char跟varchar在数据库的区别
varchar(max)在小于8000时候=varchar(8000)
varchar天然多占一个字节存储,varchar(max)占2个
nvarchar是为了兼容没有中文操作系统的环境,但是空间比varchar多一倍,一个n占两个字节,varchar中不会存储英文字节时候才用nvarchar
在MySQL 中char 和 varchar 都是存储字符串的,区别在于char有固定的长度,而varchar属于可变长的字符类型。
char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,mysql就会在它的右边用空格字符补足.(在检索操作中那些填补出来的空格字符将被去掉)在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节)。
char 固定长度,所以在处理速度上要比varchar快速很多,但是对费存储空间,所以对存储不大,但在速度上有要求的可以使用char类型。
定长的char的优势:
一,存储很短的信息,比如门牌号码101,201……这样很短的信息应该用char,因为varchar还要占1个byte用于存储信息长度,本来打算节约存储的现在得不偿失。
二,固定长度的。比如使用uuid作为主键,那用char应该更合适。因为他固定长度,varchar动态根据长度的特性就消失了,而且还要占1个长度信息。
三,十分频繁改变的column。因为varchar每次存储都要有额外的计算,得到长度等工作,如果一个非常频繁改变的,那就要有很多的精力用于计算,而这些对于char来说是不需要的。
总的说来:char定长,存储效率不如varchar,对于短数据的查询优于varchar
再者,搜索效率的优化光一个字段类型并起不到决定性的作用。常见的搜索优化方式除了建索引什么的外,对于千万级以上数据还可以使用
一个比较高效的方式,就是分区分块。我试过,和你的情况一样,主键,亿级数据,分区分块以后,搜索都是秒级的。
一.数据存储开销
1.char(n) 是定长的,也就是当你输入的字符小于你指定的数目时,char(8),你输入的字符小于8时,它会再后面补空值。当你输入的字符大于指定的数时,它会截取超出的字符。
在程序中,会返回给你8位,后面的用空格补上;
在数据库中,char(8),占用16个字节(1个字符=2个字节);
2.varchar(n) 是长度为 n 个字节的可变长度且非 Unicode 的字符数据。n必须是一个介于1和 8000之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节。所输入的数据字符长度可以为零。
二.插入数据
1.char列的NULL值占用存储空间。
- varchar列的NULL值不占用存储空间。
插入同样数量的NULL值,varchar列的插入效率明显高出char列。
插入不为null的数据时,无论插入数据涉及的列是否建立索引,varchar列的插入效率也是明显高出char列。
三.更新数据
如果更新的列上未建立索引,则char的效率低于varchar,但效率差异不大。
如果更新的列上建立索引,则char的效率低于varchar,并且效率差异很大。
四.修改结构
无论增加或删除的列的类型是char还是varchar,操作都能较快的完成,而且效率上没有什么差异。
对于增加列的宽度而言,char与varchar有非常明显的效率差异,varchar列基本上不花费时间,而修改char列需要花费很长的时间。
五.数据检索
无论是否通过索引,varchar类型的数据检索略优于char的扫描。
那实际开发中,我们使用哪种呢?
当确定字符串为定长、数据变更频繁、数据检索需求少时,使用char;
当不确定字符串长度、对数据的变更少、查询频繁时,使用varchar。