Mysql char varchar 介绍、区别

前言

下面语句中N最大值是多少?
create table t4(c int(11), c2 char(30), c3 varchar(N)) charset=utf8;
此处N的最大值为(65535-1-2-4-30x3)/3=21812
1.减1的原因是实际行存储从第二个字节开始,减2的原因是varchar头部的两个字节表示长度
2.减4的原因是int类型的c占4个字节。tinyint 占1个字节 smallint 占2个字节 mediumint 占3个字节 int 4个字节 bigint 占8个字节。
3.减30x3的原因是char(30)占用90个字节,编码是UTF8。
4.除3是因为字符集编码为utf8。
5.具体请参考

varchar(10)是什么意思?
varchar(10)的意思是可以存储的最大字符串长度为10个字符,并且字符是变长的,如果不满10个就根据实际存储的字节来确定,即存储空间为0~10个字符。注意,不同编码方式1个英文字母占的字节是不同的,如下所示:
ASCII码:一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。
UTF-8编码:一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。中文标点占三个字节,英文标点占一个字节
Unicode编码:一个英文等于两个字节,一个中文(含繁体)等于两个字节。中文标点占两个字节,英文标点占两个字节
MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。既然utf8能够存下大部分中文汉字,那为什么还要使用utf8mb4呢? 因为mysql支持的 utf8 编码最大单个字符长度为 3 字节,如果遇到 4 字节的宽字符就会插入异常了。

char 类型
char 类型是固定长度的,Mysql 在程序处理的时候不需要计算长度,所以它的速度比 varchar 要快,但是其缺点是浪费存储空间,插入时如果长度不够会在尾部以空格填充,查询时 Mysql 程序会对尾部的空格进行处理,浪费性能,综合来说,如果业务需求中字段长度变化不大的情况下使用 char 类型来存储(例如 性别 字段,不是 0 就是 1,可以设计成 char(1) )。
CHAR(M)定义的列的长度为固定的,M取值可以为0~255之间,当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检 索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义 char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充。对于char类型来说,最多只能存放的字符个数为255,和编码无关。

varchar 类型
在使用 varchar 类型的时候不能因为其长度可变就都为 varchar 定义一个很大的长度,实际开发中仍然要根据业务需求来设计合适的长度,定义一个远超实际需求长度的字段可能会影响 Mysql 程序的性能,并且还有可能出现一些未知的 BUG,所以设计 varchar 类型的长度时,一定要根据业务需求去评估,选择一个合适的长度。
VARCHAR(M)定义的列的长度为可变长字符串,M取值可以为0~65535之间,(VARCHAR的最大有效长度由最大行大小和使用 的字符集确定。整体最大长度是65,532字节)。VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则 使用两个字节)。
1、字符类型若为Latin1,varchar最多能存放65532个字符。
2、字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766个字符。
3、字符类型若为UTF8,每个字符最多占3字节,最大长度不能超过21845个字符。
若定义的时候超过上述限制,则varchar会被强制转换为text类型,并产生warning。

区别
1、char字段的最大长度为255 字符,varchar字段的最大长度为65535个 字节
2、char(n)中的n是字符数,范围是0~255(额外需要1到2个字节来存长度),语句中like后的’ ‘不会省。
3、varchar(n)中的n也是字符数,但是最大值需要通过编码来算,不能超过65535字节(从中还需要拿出1到2个字节来存长度),语句中like后的’ '不会省,字段结尾的空格也不会省。
4、一般定长的数据选用char类型,比如身份证号,手机号,电话等,长度变化很大的可以使用varchar类型。
5、注意尾部空格的匹配,特别是插入时和使用like查找时。char类型的查找效率高,varchar类型的查找效率比较低。

# Mysql中的varchar要求一个行的定义长度不能超过65535字节,若定义的表长度超过这个值,则提示:
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs.
所以实际运用中varchar长度限制的是一个行定义的长度。
所以,这里的N最大取值是21812create table t4(c int(11), c2 char(30), c3 varchar(N)) charset=utf8;
create table t4(c int(11), c2 char(30), c3 varchar(21812)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值