美文网首页
MySQL之vachar

MySQL之vachar

作者: 田真的架构人生 | 来源:发表于2017-08-08 21:48 被阅读0次

    5.0.3之前,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节),最大0-255个字节。

    5.0.3之后,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个。

    在建表时,当超过长度限制,MySql会报错,建议使用TEXT或者BLOB;而当INSERT数据时,如果VALUE超出VARCHAR声明时的长度,则会自动被截断。

    varchar 字段是将实际内容单独存储在聚簇索引之外(这也是为什么不建议用字符串做主键的原因之一),内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),
    另外,开头还有1个字节存放其它一些控制信息。

    所以,一个表所有类型的列,大小加起来不能超过65532字节(不包括text、blob,2字节存储varchar长度,1字节存储其它信息)

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

    如下图:使用最大值32766时,正确创建。


    MySQL之vachar

    如果若使用32767,MySql则会报出异常,创建失败。


    MySQL之vachar
    b) 若一个表定义为
      create table t2(i int, c char(30), ch 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。

    相关文章

      网友评论

          本文标题:MySQL之vachar

          本文链接:https://www.haomeiwen.com/subject/yzpxrxtx.html