char和varchar的区别
Posted wzk-0000
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了char和varchar的区别相关的知识,希望对你有一定的参考价值。
char是一种固定长度的类型,表示字符,它存贮的每个值都占固定个字节
在java内存中,编码为UTF-16,占两个字节(不管英文字母还是中文汉字)
在其它外部环境(所有我们能看见的环境),编码为UTF-8时,一个字母占一个字节,一个汉字占3个字节;编码为GBK时,一个字母占一个字节,一个汉字占2个字节。
在mysql中,这个数字表示的是存储多少个字符的意思,这条数据占多少字节还要看哪种编码。存储的字符串长度不足指定长度时,则会空格补齐(一个空格就是一个字符)。
例如:char(10) --假设utf-8编码 ,每条数据最多可以存放10个字符,如果存放的是字母,则这条数据占用10个字节,不管里面有没有写入10个字符,不足的会空格补齐(在检索操作中那些填补出来的空格字符将被去掉);如果存放的是汉字,则这条数据占用30个字节。
varchar:是可变长度的类型(mysql5.0.3之前varchar的长度范围为0-255,mysql5.0.3之后varchar的长度范围为0-65535个字节),
MySql中的每条数据只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节,长度超过255时需要2个字节).
例如:varchar(10)--假设utf-8编码,每条数据最多存放10个字符,如果存入5个英文5个汉字,则占用字节数是:5+5*3+1=21
请问自动空格补齐,是怎么补齐的呢?对于char(5)--utf-8编码,假如存入4个字母,它所占字节是多少呢?还需要自动空格补齐吗?假如存入4个汉字呢?
总的来说,
String str = "abc中国"
字符串str有5个字符,在utf-8编码下,有3+2*3=8个字节;在gbk编码下,有3+2*2=7个字节,
存放在mysql数据库中如果是char(10)类型(10表示最多存放字符数),utf-8编码,所占字节是根据存储英文/中文变化的。不足10个字节的会自动空格补齐。
如果是varchar(10)类型(10仍表示最多存放的字符数),uft-8编码,所占字节是3+2*3+1=9个字节,最后一个是记录数据长度(超过255时,占两个字节)
主要有两点不同:1、char固定长度,字符串长度不足时会用字符空格补齐;varchar是可变长度,实际长度+1~2个字节的标记
2、char查询比varchar更快,即空间换时间
以上是关于char和varchar的区别的主要内容,如果未能解决你的问题,请参考以下文章