精华内容
下载资源
问答
  • 那么来验证下 varchar 类型的实际最大长度:测试环境:MySQL版本 5.7.19//首先要设置下 mysql 为严格执行模式,不然 varchar 超出最大长度为自动转为 text 类型set sql_mode="STRICT_TRANS_TABL...

    MySQL 表中行的最大大小为 65,534(实际行存储从第二个字节开始)字节。每个 BLOB 和 TEXT 列只占其中的 5 至 9 个字节。

    那么来验证下 varchar 类型的实际最大长度:

    测试环境:MySQL版本 5.7.19

    //首先要设置下 mysql 为严格执行模式,不然 varchar 超出最大长度为自动转为 text 类型

    set sql_mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";

    [SQL]

    CREATE TABLE test(

    va VARCHAR(21845)

    )DEFAULT CHARSET=utf8;

    1118 - 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

    这里看到 21,845 个字符,utf-8 下刚好为 65,535 个字节,但是 varchar 保存时用一个字节或两个字节长的前缀+数据。如果 varchar 列声明的长度大于 255,长度前缀是两个字节,所以 varchar 的最大长度应为:

    65532=65535-1-2(字节)

    utf-8 下为 21844=65532/3(字符)

    看示例:

    [SQL]

    CREATE TABLE test(

    va VARCHAR(21844)

    )DEFAULT CHARSET=utf8;

    Query OK, 0 rows affected

    那么看下 text 类型在实际行中占用的字节数:

    [SQL]

    CREATE TABLE test1(

    va VARCHAR(21841),

    tx text

    )DEFAULT CHARSET=utf8;

    1118 - 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

    可以看出错误提示,行长已经超过最大长度。在上文看到,

    每个 BLOB 和 TEXT 列只占其中的 5 至 9 个字节。

    但是 va 字段已经给 tx 字段腾出了 9 字节的空间了啊,为什么还是不行呢。

    从官方文档看到

    BLOB 和 TEXT 类型需要 1、2、3 或者 4 个字节来记录列值的长度,取决于该类型的最大可能的长度。

    那么就是至少需要 10 字节(9+1)的空间了,再试一下:

    [SQL]

    CREATE TABLE test1(

    va VARCHAR(21840),

    tx text

    )DEFAULT CHARSET=utf8;

    Query OK, 0 rows affected

    这里看到,当 va 字段腾出 12 字节的空间时,表可以创建成功。

    varchar 最长是 64k,但是注意 这里的 64k 是整个 row 的长度,要考虑到其它的 column,还有如果存在 not null 的时候也会占用一位,对不同的字符集,有效长度还不一样,比如 utf8,最多 21,845,还要除去别的 column,但是 varchar 在一般情况下存储都够用了。

    如果遇到了大文本,考虑使用 text,最大能到 4G。效率来说基本是 char>varchar>text,但是如果使用的是 Innodb 引擎的话,推荐使用 varchar 代替 char。char 和 varchar 可以有默认值,text 不能指定默认值。

    展开全文
  • MySQL varchar最大长度,text类型占用空间剖析作者:nango 阅读:2270次 来源:http://blog.csdn.net/free_ant/article/details/52936756 时间...接下来看下,`varchartext`最大占用空间,以及text是否占用行的最大长...

    MySQL varchar最大长度,text类型占用空间剖析

    作者:nango  阅读:2270次  来源:http://blog.csdn.net/free_ant/article/details/52936756  时间:2016-10-26 22:32

    上一篇博文已经介绍了MySQL的字段类型以及占用的空间大小,接下来看下,`varchar,text`最大占用空间,以及text是否占用行的最大长度。

    MySQL表中行的最大大小为65,534(实际行存储从第二个字节开始)字节。**每个BLOB和TEXT列 账户只占其中的5至9个字节。**

    那么来验证下`varchar`类型的实际最大长度:

    测试环境:`MySQL版本 5.6.17`

    ```

    //首先要设置下mysql为严格执行模式,不然varchar超出最大长度为自动转为text类型

    set sql_mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";

    ```

    ```

    [SQL]

    CREATE TABLE test(

    va VARCHAR(21845)

    )DEFAULT CHARSET=utf8;

    [Err] 1118 - 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

    ```

    这里看到21845个字符,`utf-8`下刚好为65535个字节,但是`varchar`保存时用一个字节或两个字节长的前缀+数据。如果`varchar`列声明的长度大于255,长度前缀是两个字节,所以varchar的最大长度应为:

    ```

    65532=65535-1-2(字节)

    utf-8下为 21844=65532/3(字符)

    ```

    看示例:

    ```

    [SQL]

    CREATE TABLE test(

    va VARCHAR(21844)

    )DEFAULT CHARSET=utf8;

    受影响的行: 0

    时间: 0.155s

    ```

    那么看下`text`类型在实际行中占用的字节数:

    ```

    [SQL]

    CREATE TABLE test(

    va VARCHAR(21841),

    tx text

    )DEFAULT CHARSET=utf8;

    [Err] 1118 - 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

    ```

    可以看出错误提示,行长已经超过最大长度。在上文看到,

    > 每个BLOB和TEXT列 账户只占其中的5至9个字节。

    但是`va`字段已经给`tx`字段腾出了9字节的空间了啊,为什么还是不行呢。

    最好再官方文档看到

    > BLOB和TEXT类型需要 1、2、3或者4个字节来记录列值的长度,取决于该类型的最大可能的长度。

    那么就是至少需要10字节(9+1)的空间了,再试一下:

    ```

    [SQL]

    CREATE TABLE test(

    va VARCHAR(21840),

    tx text

    )DEFAULT CHARSET=utf8;

    受影响的行: 0

    时间: 0.170s

    ```

    这里看到,当`va`字段腾出12字节的空间时,表可以创建成功。其他的类型基本都是固定字节的,所以就不再实验,有兴趣的可以自己试试。

    展开全文
  • 上一篇博文已经介绍了MySQL的字段类型以及占用的空间大小,接下来看下,varchartext最大占用空间,以及text是否占用行的最大长度。MySQL表中行的最大大小为65,534(实际行存储从第二个字节开始)字节。每个BLOB和...

    上一篇博文已经介绍了MySQL的字段类型以及占用的空间大小,接下来看下,varchar,text最大占用空间,以及text是否占用行的最大长度。

    MySQL表中行的最大大小为65,534(实际行存储从第二个字节开始)字节。每个BLOB和TEXT列 账户只占其中的5至9个字节。

    那么来验证下varchar类型的实际最大长度:
    测试环境:MySQL版本 5.6.17

    //首先要设置下mysql为严格执行模式,不然varchar超出最大长度为自动转为text类型
    set sql_mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";
    [SQL]
    CREATE TABLE test(
        va VARCHAR(21845)
    )DEFAULT CHARSET=utf8;
    [Err] 1118 - 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

    这里看到21845个字符,utf-8下刚好为65535个字节,但是varchar保存时用一个字节或两个字节长的前缀+数据。如果varchar列声明的长度大于255,长度前缀是两个字节,所以varchar的最大长度应为:

    65532=65535-1-2(字节)
    utf-8下为 21844=65532/3(字符)

    看示例:

    [SQL]
    CREATE TABLE test(
        va VARCHAR(21844)
    )DEFAULT CHARSET=utf8;
    受影响的行: 0
    时间: 0.155s

    那么看下text类型在实际行中占用的字节数:

    [SQL]
    CREATE TABLE test(
        va VARCHAR(21841),
        tx text
    )DEFAULT CHARSET=utf8;
    [Err] 1118 - 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

    可以看出错误提示,行长已经超过最大长度。在上文看到,

    每个BLOB和TEXT列 账户只占其中的5至9个字节。

    但是va字段已经给tx字段腾出了9字节的空间了啊,为什么还是不行呢。
    最好再官方文档看到

    BLOB和TEXT类型需要 1、2、3或者4个字节来记录列值的长度,取决于该类型的最大可能的长度。

    那么就是至少需要10字节(9+1)的空间了,再试一下:

    [SQL]
    CREATE TABLE test(
        va VARCHAR(21840),
        tx text
    )DEFAULT CHARSET=utf8;
    受影响的行: 0
    时间: 0.170s

    这里看到,当va字段腾出12字节的空间时,表可以创建成功。其他的类型基本都是固定字节的,所以就不再实验,有兴趣的可以自己试试。

    展开全文
  • MySQL 表中行的最大大小为 65,534(实际行存储从第二个字节开始)字节。...//首先要设置下 mysql 为严格执行模式,不然 varchar 超出最大长度为自动转为 text 类型 set sql_mode="STRICT_TRANS_...

    MySQL 表中行的最大大小为 65,534(实际行存储从第二个字节开始)字节。每个 BLOB 和 TEXT 列只占其中的 5 至 9 个字节。

    那么来验证下 varchar 类型的实际最大长度:
    测试环境:MySQL版本 5.7.19

    //首先要设置下 mysql 为严格执行模式,不然 varchar 超出最大长度为自动转为 text 类型
    set sql_mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";
    
    [SQL]
    CREATE TABLE test(
        va VARCHAR(21845)
    )DEFAULT CHARSET=utf8;
    1118 - 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
    

    这里看到 21,845 个字符,utf-8 下刚好为 65,535 个字节,但是 varchar 保存时用一个字节或两个字节长的前缀+数据。如果 varchar 列声明的长度大于 255,长度前缀是两个字节,所以 varchar 的最大长度应为:

    65532=65535-1-2(字节)
    utf-8 下为 21844=65532/3(字符)
    

    看示例:

    [SQL]
    CREATE TABLE test(
        va VARCHAR(21844)
    )DEFAULT CHARSET=utf8;
    Query OK, 0 rows affected
    

    那么看下 text 类型在实际行中占用的字节数:

    [SQL]
    CREATE TABLE test1(
        va VARCHAR(21841),
        tx text
    )DEFAULT CHARSET=utf8;
    1118 - 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
    

    可以看出错误提示,行长已经超过最大长度。在上文看到,

    每个 BLOB 和 TEXT 列只占其中的 5 至 9 个字节。

    但是 va 字段已经给 tx 字段腾出了 9 字节的空间了啊,为什么还是不行呢。
    从官方文档看到

    BLOB 和 TEXT 类型需要 1、2、3 或者 4 个字节来记录列值的长度,取决于该类型的最大可能的长度。

    那么就是至少需要 10 字节(9+1)的空间了,再试一下:

    [SQL]
    CREATE TABLE test1(
        va VARCHAR(21840),
        tx text
    )DEFAULT CHARSET=utf8;
    Query OK, 0 rows affected
    

    这里看到,当 va 字段腾出 12 字节的空间时,表可以创建成功。

    varchar 最长是 64k,但是注意 这里的 64k 是整个 row 的长度,要考虑到其它的 column,还有如果存在 not null 的时候也会占用一位,对不同的字符集,有效长度还不一样,比如 utf8,最多 21,845,还要除去别的 column,但是 varchar 在一般情况下存储都够用了。

    如果遇到了大文本,考虑使用 text,最大能到 4G。效率来说基本是 char>varchar>text,但是如果使用的是 Innodb 引擎的话,推荐使用 varchar 代替 char。char 和 varchar 可以有默认值,text 不能指定默认值。

    展开全文
  • 在mysql中使用 uft-8(mysql中的 utf-8 和我们正常的编码utf-8不同)字符集一个字符占用三个字节,①使用utf-8字符编码集varchar最大长度是(65535-2)/3=21844个字符(超过255个字符会有2字节的额外占用空间开销,所以减...
  • 概述今天跟一群大佬在讨论int(1)跟int(10)所占的存储... )数值类型存储需求注意:int(10)这里的10指的是数值的宽度,并不是字节日期和时间类型的存储需求字符串类型的存储需求注意:这里的M只是为了说明占用空间大小...
  • 255个字符,utf-8编码的话,占用255 * 3个字节占用空间:n其他:在获取数据出来之后,一定要记得trim空格,因为不足char(n)的长度,会自动填充空格因为定长的char不容易产生碎片,所以char比varchar在空间上也更有效...
  • 在mysql中使用 uft-8(mysql中的 utf-8 和我们正常的编码utf-8不同)字符集一个字符占用三个字节,①使用utf-8字符编码集varchar最大长度是(65535-2)/3=21844个字符(超过255个字符会有2字节的额外占用空间开销,所以减...
  • 数据的检索效率是:char>...text空间占用方面,要具体情况具体分析了。M个字节,0 <=M<= 255L+1个字节,其中L<=M且0 <=M<= 65535建表时M的最大值为65532L+2个字节,其中L<216Char...
  • [Int 整数 char 定长字符 Varchar 变长字符 ...Varchar 是可变长度的字符类型,内容有多大就占用多大的空间,能有效节省空间Varchar 是变长,节省存储空间,char 是固定长度。 查找效率要 char 型快,因为 varc...
  • MySQL中char、varchartext的区别  ...空间占用方面,要具体情况具体分析了。 CHAR(M) M个字节,0 M VARCHAR(M) L+1个字节,其中LM且0 M TEXT L+2个字节,其中L16
  • 1、MySQL之char、varchartext的设计:  (1)char(n)和varchar(n)括号中n代表... (2)char和varchar的区别在于char不管存入的值value实际占用多少个字节都会占用n个字符的空间,而varchar只会占用实际字符占
  • 1、 char长度固定, 即每条数据占用等长字节空间;适合用在身份证号码、手机号码等定。2、 varchar可变长度,可以设置最大长度;适合用在长度可变的属性。3、 text不设置长度, 当不知道属性的最大长度时,适合用...
  • 1、 char长度固定, 即每条数据占用等长字节空间;适合用在身份证号码、手机号码等定。 2、 varchar可变长度,可以设置最大长度;适合用在长度可变的属性。 3、 text不设置长度, 当不知道属性的最大长度时,适合用...
  • 参考下面这个表结构: 1、 char长度固定, 即每条数据占用等长字节空间;适合用在身份证号码、手机号码等定。2、 varchar可变长度,可以设置最大长度;适合用在长度可变的属性。3、 text不设置长度, 当不知道属性的...
  • char和varchar最大的区别就在于char不管实际value都会占用n个字符的空间,而varchar只会占用实际字符应该占用空间+1,并且实际空间+1<=n。 超过char和varchar的n设置后,字符串会被截断。 char在存储的时候会...
  • 空间占用方面,就要具体情况具体分析了。 1.char:存储定长数据很方便,CHAR字段上的索引效率级高,必须在括号里定义长度,可以有默认值,比如定义char(10),那么不论你存储的数据是否达到了10个字符,都要占去10个...
  • 他们的存储方式和数据...空间占用方面,要具体情况具体分析了。 名称 占用长度 其他 CHAR(M) M个字节,0 定长 VARCHAR(M) L+1个字节,其中L且0 变长,当值保存和检索时尾部的空格仍保留 TEXT L+2个字节,其
  • char和varchar的区别在于:char不管实际的value值是多少,都会占用n个字符空间,而varchar只会占用实际字符占用空间+1,并且实际空间+1<=n; 下图可以非常明显的看到结果: Value CHAR(4) ...
  • mysql之char、varchartext

    千次阅读 2017-11-12 20:07:22
    char、varchartext是mysql数据库中使用的三种字符串类型,简述一下三者之间的区别。- char(n) 定长字符串,n表示字符数上限,超过存储上限字符会被截断。n也是存储空间的实际长度,不管实际字符串有多长,都会占用...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 211
精华内容 84
关键字:

text占用空间varchar