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小时内删除。
发表评论