zoukankan      html  css  js  c++  java
  • MySQL CHAR VARCHAR

    char(M)和varchar(M)的M都是指字符数,但是他们的最大长度计算是不一样的,char直接计算字符数,而varchar计算行字节数。

    今天早上发现昨天写的这篇博客有个误区:我以为行字节是只计算varchar类型,但实际上是所有列的字节都会进行计算。

    char允许的最大字符数为255,是字符数;而varchar主要是最大行字节数,是字节数,并且是行字节数,即create table时所有varchar列相加。

    意思就是:每一列都可以定义char的字符数为255,而定义varchar,需要一张表中所有varchar列的最大字节数的和(注:还包括标识消耗的字节,长度标识和NULL标识)不超过varchar的最大行字节数(默认是2^16-1=65535)

    我写的不太好,可以直接去看这个博主的文章,刚学习回来。
    学习文章:可以直接过去看看,这个博主写的很好,通俗易懂

    MySQL中VARCHAR最大长度是多少?CHAR和VARCHAR有哪些区别? 

    创建一个表,9列都为varchar类型,那么varchar(M)可以定义多少?

    结果如下:

    create table k(a varchar(7279),b varchar(7279),c varchar(7279),d varchar(7279),e varchar(7279),
    f varchar(7279),g varchar(7279),i varchar(7279),j varchar(7283)) charset latin1;

    在k表增加一列 alter table k add k int,是会报错的:ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs。

    这就说明不只是varchar会进行行字节的计算,其他类型也会。

    为什么j列是7283,而不是7284?

    计算公式:

    2^16-1(varchar的最大字节长度)-2*9(9列的长度标识消耗的字节数)-9/8(9列允许空,1列NULL就用1bit标识,那么就是9bit,8bit=1byte)-8*7279(8列的总字节)=7283

    以上的计算方式可以详细看这篇文章,作者讲的很好。

    MySQL中VARCHAR最大长度是多少?CHAR和VARCHAR有哪些区别? 

    记录长度,之所以每一列需要2个字节是因为:

    varchar记录长度需要1-2个字节,当长度不超过255个字节,需要1字节标识长度,而超过255个字节,则需要2个字节标识长度。

    为什么?

    因为1字节=8位,2^8-1=255,

    而大于255,小于65535,用二进制2个字节就够了,2字节=16位,2^16-1=65535,和varchar的默认最大行长度刚好相等。

    其中,对于NULL的标识的解释:

    NULL的标识是每一行的数据共有的,而不是每一列共有,同一行共有NULL标识,并且同一行所有的字节加起来就得是2^16-1

    而每一列都可以为NULL,那么每一列都需要一bit来标识NULL,但是他们是一行数据来标识NULL,上方的表中,一共有9列,那么一行数据就应该有9个bit来标识NULL,而1byte(字节)=8bit,所以9/8=2(向上取整)

    上方超链的博主的原文:

    如果有一个列允许为空,则需要1 bit来标识,每8 bits的标识会组成一个字段,该字段会存放在每行最开始的位置。
    注意,这个标识位不是放在每列,而是每行共享。
    假设一张表中存在N个可空字段,NULL标识位需要
    N/8(向上取整)个字节
  • 相关阅读:
    Java学习
    机器学习
    机器学习
    Java 学习
    哈希表复习
    [转] 数据库设计步骤
    Java
    c++的函数重载-笔记
    进程与线程-笔记
    内存知识-笔记
  • 原文地址:https://www.cnblogs.com/woyujiezhen/p/13550800.html
Copyright © 2011-2022 走看看