Mysql中varchar和char区别
⼀、varchar和char的区别:
区别⼀:定长和变长
char表⽰定长、长度固定,varchanr表⽰变长,即长度可变。
即char类型是规定多少字长则必须存储多少字长,超过的长度的字段则只能截取出对应的长度进⾏存储,相对于要求字长长度不够的字段则⽤空格补齐。
⽽varchar类型则是只要在规定字长之内,有多少存多少,⽆需补齐;超出的部分和char⼀样,舍去即可。(由perfix来实现)
区别⼆:存储容量不同
对于char类型来说,最多只能存放的字符个数为255,和编码⽆关。
varchar最多能存放65532个字符。VARCHAR的最⼤有效长度由最⼤⾏⼤⼩和使⽤的字符集来确定。整体最⼤长度是65,532字节。⼆、在Mysql中⽤来判断是否需要进⾏对据列类型转换的规则
1. 在⼀个数据列表⾥,如果每个数据列的长度都是固定的,那么每个数据列的宽度也是固定的。
2. 只要数据列表⾥有⼀个数据列的长度可变,那么个数据列的长度都是可变的。
3. 如果某个数据表⾥的某个数据⾏的长度是可变的,那么为了节约时间,Mysql会把这个数据库⾥的固定长度类型转换为可变长度类型。
但是长度⼩于4的char类型不会转换为varchar类型。
三、 Mysql中varchar的最⼤长度为多少?(这不是⼀个固定的数字)
1. 限制规则
存储限制
varchar字段是将实际内容存储在聚簇索引之外,内容开头⽤1到2个字节表⽰实际长度(长度超过255时需要2个字节),因
此最⼤长度不能超过65535字符。
编码长度限制
字符类型若为gbk,每个字符最多占2个字节,最⼤长度不能超过32766;
字符类型若为UTF8,每个字符最多占3字节,最⼤长度不能超过21845;
若定义的时候超过上述限制,则varchar会被强制转换为text类型,并产⽣warning。
⾏长度限制
导致实际运⽤中varchar长度限制的是⼀个⾏定义的长度。Mysql要求⼀个⾏的定义长度不能超过65535bytes,若定义的表
长度超过这个值,则提⽰:
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
varchar2最大长度
由字符集来确定,字符集分单字节和多字节
Latin1 ⼀个字符占⼀个字节,最多能存放 65532 个字符
GBK ⼀个字符占两个字节,最多能存 32766 个字符
UTF8 ⼀个字符占三个字节,最多能存 21844 个字符
注意,char 和 varchar 后⾯的长度表⽰的是字符的个数,⽽不是字节数。
2. 计算例⼦
若⼀个表只有⼀个varchar类型。其定义为
create table t4(c varchar(N)) charset=gbk; 则此处N的最⼤值为(65535-1-2)/2=32766个字符。
减1的原因是实际⾏存储从第⼆个字节开始;
减2的原因是varchar头部的两个字节表⽰长度;
除2的原因是字符编码是gbk
若⼀个表定义为
create table t4(c int, c2 char(30), c3 varchar(N)) charset=utf8;则此处的最⼤值为(65535-1-2-4-30*3)/3=21812
减1与减2原因与上述例⼦相同
减4的原因是int类型的c占4个字节;
减30*3的原因是char(30)占⽤90个字节,编码是UTF8。
如果被varchar超过上述的b规则,则被强转为text类型,则每个字段占⽤定义长度为11字节,当然这已经不
是“varchar”了。
则此处N的最⼤值为(65535-1-2-4-30*3)/3=21812
create table t4(c int, c2 char(30), c3 varchar(21812)) ENGINE=InnoDB DEFAULT CHARSET=utf8

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。