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一定是两个字节吗?不是的,这个跟我们选用的字符编码有关,如果采用”ISO-8859-1”编码,那么一个char只会有一个字节。如果采用”UTF-8”或者“GB2312”、“GBK”等编码格式呢?这几种编码格式采用的是动态长度的,如果是英文字符,大家都是一个字节。如果是中文,”UTF-8”是三个字节,而”GBK”和”GB2312”是两个字节。而对于”unicode”而言,无论如何都是两个字节。
然后再回答第二个问题,对于一个char如果用”ISO-8859-1”来存储的话,肯定无法存储一个中文,而对于”UTF-8”、“GB2312”、“GBK”而言大多数中文字符是可以存储的。

原文地址:https://www.cnblogs.com/wzk-0000/p/9876636.html