MySQL中varchar与char区别

转载自:https://www.cnblogs.com/ttxcs/p/11614473.html

  

一. varchar存储规则

  4.0版本以下,varchar(20),指的是20字节,如果存放UTF-8汉字时,只能存6个(每个汉字3字节) ;
  5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF-8汉字(每个汉字3字节),都可以存放20个字符 Mysql4中最大也不过是20个字节,但是Mysql5根据编码不同,存储大小也不同。

  

二. varchar和char 的区别

区别1:定长和变长

  char 表示定长,长度固定,varchar表示变长,即长度可变。当所插入的字符串超出它们的长度时,视情况来处理,如果是严格模式,则会拒绝插入并提示错误信息,如果是宽松模式,则会截取然后插入。如果插入的字符串长度小于定义长度时,则会以不同的方式来处理,如char(10),表示存储的是10个字符,无论你插入的是多少,都是10个,如果少于10个,则用空格填满。而varchar(10),小于10个的话,则插入多少个字符就存多少个。

区别:2:存储的容量不同

  对 char 来说,最多能存放的字符个数 255,和编码无关。
  而 varchar 呢,最多能存放 65532 个字节。VARCHAR 的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是 65,532字节 (65535-3=65532 减1的原因是实际行存储从第二个字节开始’; 减2的原因是varchar头部的2个字节表示长度;)

  

三. MySQL中varchar最大长度是多少?

  这不是一个固定的数字。字段的限制在字段定义的时候有以下规则:
  a) 存储限制
   varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最 大长度不能超过65535字节。

  b) 编码长度限制
  字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766; 字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。

   c) 行长度限制
  导致实际应用中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。
  由字符集来确定,字符集分单字节和多字节:Latin1 一个字符占一个字节,最多能存放 65532 个字符;GBK 一个字符占两个字节, 最多能存 32766 个字符;UTF8 一个字符占三个字节, 最多能存 21844 个字符。
  注意,char 和 varchar 后面的长度表示的是字符的个数,而不是字节数。

  


举两个例说明一下实际长度的计算。
  a) 若一个表只有一个varchar类型,如定义为
  create table t4(c varchar(N)) charset=gbk;
  则此处N的最大值为(65535-1-2)/2= 32766 个字符。减1的原因是实际行存储从第二个字节开始;减2的原因是varchar头部的2个字节表示长度; 除2的原因是字符编码是gbk。

  b) 若一个表定义为
  create table t4(c int, c2 char(30), c3 varchar(N)) charset=utf8;
  则此处N的最大值为 (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 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值