一个5年工作经验的小伙伴,在面试的时候被这样一个问题。说”存储MD5值应该用VARCHAR还是用CHAR“,他一时间不只如何选择,感觉用VARCHAR也可以,用CHAR也行。希望我来帮忙分析一下。
另外,我花了很长时间,准备了一份500页的PDF面试资料文档和一份10W字的Java总结面试题和答案,
1、两者区别
要回答好这个问题,得了解清楚CHAR和VARCHAR的区别:
ENTER TITLE
第1,存储长度不同
CHAR类型的长度是固定的,VARCHAR的长度是可变的。
ENTER TITLE
假设,当我们当定义CHAR(10),输入的值是”abc”,但是它占用的空间一样是10个字节,会包含7个空字节。当输入的字符长度超过指定的数时,CHAR会截取超出的字符。而且,当存储为CHAR的时候,MySQL会自动删除输入字符串末尾的空格。
ENTER TITLE
所以,CHAR非常适合存储很短的、固定长度的字符串。
VARCHAR类型用于存储可变长度且非Unicode的字符数据。但可变长度必须在1和8000之间的数值。
ENTER TITLE
比如VARCHAR(10),然后输入abc三个字符,那么实际存储大小为3个字节。
ENTER TITLE
除此之外,VARCHAR还会保留1个或2个额外的字节来记录字符串的实际长度。如果定义的最大长度小于等于255个字节,那么,就会预留1个字节;如果定义的最大长度大于255个字节,那么就会预留2个字节。
ENTER TITLE
第2,存储效率不同
ENTER TITLE
CHAR类型每次修改后的数据长度不变,效率更高。而VARCHAR每次修改的数据要更新数据长度,效率更低。
ENTER TITLE
第3,存储空间不同
ENTER TITLE
CHAR存储空间是初始的预计长度字符串再加上一个记录字符串长度的字节,可能会存在多余的空间。而VARCHAR存储空间的时候是实际字符串再加上一个记录字符串长度的字节,占用空间较小。
2、答案分析
根据以上的分析,CHAR非常适合存储MD5值。因为MD5是一个定长的值,对于固定长度的非常短的列,CHAR比VARCHAR效率也更高。
最后,我把之前分享的视频全部整理成了文字。