背景
学过MySQL的同窗都知道MySQL中varchar和char是两种最主要的字符串类型,varchar是变长的类型,而char是固定长度。那关于如何选择类型就成为使人头疼的事,不少初学者为了保证业务兼容性强,存储字符串类型一概都是varchar类型。这是不妥的,须要根据varchar和char的特性来进行选择。java
varchar和char数据类型的区别
varchar类型用于存储可变长的字符串,是比较常见经常使用的字符串数据类型,在存储的字符串是变长时,varchar更加节约空间。因为varchar是变长的,在使用update的时候,可能使得行变得比原来更长,这就致使须要作额外的工做。若是一个行占用的空间增长,而且在页内没有多余的空间可与存储,这是innoDB的存储引擎须要分裂页来使行能够放进页内。性能
char类型是定长的。在存储数据时,MySQL会删除全部文末的空格,因此,即使你存储的是:'abc ',注意这个字符串末尾是有空格的,也会在存储时把这个空格删掉,这点须要注意。内存
适用的场景
varchar适用的场景:字符串
- 字符串列的最大长度比平均长度要大不少;
- 字符串列的更新不多时,由于没有或不多有内存碎片问题;
- 使用了UTF-8这样复杂的字符集,每一个字符都使用不一样的字节数进行存储;
char适用的场景:class
- 列的长度为定值时适合适用,好比:MD5密文数据
varchar和char的优缺点
varchar的优势:兼容性
- 变长的字符串类型,兼容性更好
varchar的缺点:date
- 使用varchar可能会产生内存碎片
- varchar会额外须要1到2个字节存储长度信息
- update语句可能会致使页分裂
char的优势:数据类型
- 定长的字符串类型,减小内存碎片
- 无需额外的内存空间去存储长度信息
char的缺点:im
- 会删除列末尾的空格信息
参考: 《高性能MySQL第3版》第四章数据