• VARCHAR(N)类型,utf8编码,则N最大值为多少,n表示什么?


    4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节)
    5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532字节
    1、限制规则
    a) 存储限制
    需要额外地在长度列表上存放实际的字符长度:小于255为1个字节,大于255则要2个字节
    b) 编码限制
    gbk:每个字符最多占用2个字节
    utf8:每个字符最多占用3个字节
    c) 长度限制
    MySQL定义行的长度不能超过65535,这个限制了列的数目,比如char(255) utf8
    那么列的数目最多有65535/(255*3)=85,列的数目可以从这里得到依据

    行长度计算公式如下:
    row length = 1
    + (sum of column lengths)
    + (number of NULL columns + delete_flag + 7)/8
    + (number of variable-length columns)
    ① 对于MyISAM,需要额外1个位来记录值是否为NULL;对于InnoDB,没有区别
    ② 对于row_format为fixed,delete_flag为1;对于row_format=dynamic,delete_flag为0

    根据这个公式,我们便能够解答开头N的最大值:(65535-1-2)/3
    减1是因为实际存储从第2个字节开始
    减2则因为要在列表长度存储实际字符长度
    除3是因为utf8编码限制

    再来一道:
    create table t4(c int, c2 char(30), c3 varchar(N)) charset=utf8;
    N的最大值:(65535-1-2-4-30*3)/3

    则此处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”了

    出处:https://blog.csdn.net/u012048106/article/details/23173911

  • 相关阅读:
    App开发Native.js入门指南
    C# Dapper 基本使用 增删改查事务等
    特殊字符码
    assert
    俩个高斯分布之间的KL散度
    np.random.normal(loc=0,scale=1e-2,size=shape)
    解决Github加载ipynb文件缓慢/失败
    画出8个高斯分布散点图
    解决tensorflow报错ValueError: Variable conv1/weights already exists, disallowed.原因:第二次使用的是第一次的就的变量
    互信息
  • 原文地址:https://www.cnblogs.com/cag2050/p/10370821.html
Copyright © 2020-2023  润新知