zoukankan      html  css  js  c++  java
  • MySQL字段类型VARCHAR

    varchar(n),n表示什么

    • MySQL5.0.3之前varchar(n)这里的n表示字节数
    • MySQL5.0.3之后varchar(n)这里的n表示字符数,比如varchar(200),不管是英文还是中文都可以存放200个

    VARCHAR字段限制原因

    字段的限制在字段定义的时候有以下规则:

    • a) 存储限制
      varchar字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535。
    • b) 编码长度限制
      字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;
      字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。
      对于英文比较多的论坛 ,使用GBK则每个字符占用2个字节,而使用UTF-8英文却只占一个字节。
      若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。
    • c) 行长度限制
      导致实际应用中varchar长度限制的是一个行定义的长度。
      MySQL要求一个行的定义长度不能超过65535。
      若定义的表长度超过这个值,则提示“ERROR 1118 (42000): Row size too large. ”

    举两个例说明一下实际长度的计算。

    • 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-303)/3=21812
      减1和减2与上例相同;
      减4的原因是int类型的c占4个字节;
      减30
      3的原因是char(30)占用90个字节,编码是utf8。
      如果被varchar超过上述的b规则,被强转成text类型,则每个字段占用定义长度为11字节,即字段不再是“varchar”。

  • 相关阅读:
    Java多线程-ThreadLocal和InheritableThreadLocal的使用
    Java多线程-join的使用
    VsCode配置让 ts 文件自动编译为 js文件
    npm和yarn更改依赖包全局下载和缓存路径
    npm和yarn更改淘宝镜像
    Java多线程-管道流实现线程间通信
    Java多线程-生产者/消费者模式实现
    Java多线程-使用 wait / notify 实现线程间的通信
    Java多线程-volatile关键字
    Java多线程-synchronized(非this对象)
  • 原文地址:https://www.cnblogs.com/one-villager/p/8554192.html
Copyright © 2011-2022 走看看