精华内容
下载资源
问答
  • MySQL表中行的最大大小为65,534(实际行存储从第二个字节开始)字节。每个BLOB和TEXT列 账户...//首先要设置下mysql为严格执行模式,不然varchar超出最大长度为自动转为text类型 set sql_mode="STRICT_TRANS_TABLES,NO

    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字节的空间时,表可以创建成功。

    char 范围是0~255, 

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

    如果遇到了大文本,考虑使用text,最大能到4G。效率来说基本是char>varchar>text,但是如果使用的是Innodb引擎的话,推荐使用varchar代替char。char和varchar可以有默认值,text不能指定默认值数据库选择合适的数据类型存储还是很有必要的,对性能有一定影响。

    对于int类型的,如果不需要存取负值,最好加上unsigned;对于经常出现在where语句中的字段,考虑加索引,整形的尤其适合加索引。

    展开全文
  • 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 的 varchartext 对比

    千次阅读 2019-12-13 11:33:32
    MySQL 的 varchartext 对比   varchartext 是 MySQL 字符存储...  varchar 在 MySQL 中必须满足最大行宽度限制,也就是 65535(64k) 字节,而 varchar 本身是按字符串个数来定义的,在 MySQL 中使用 uft-...

    MySQL 的 varchar 与 text 对比

      varchar 和 text 是 MySQL 字符存储争议比较多的领域,究竟大字段用那个比较好,我们来对比一下,然后自行选择。

    1 大小对比

    1.1 VARCHAR

      varchar 在 MySQL 中必须满足最大行宽度限制,也就是 65535(64k) 字节,而 varchar 本身是按字符串个数来定义的,在 MySQL 中使用 uft-8 字符集一个字符占用三个字节,所以单表 varchar 实际占用最大长度如下:
      1)使用 utf-8 字符编码集 varchar 最大长度是 (65535-2)/3 = 21844 个字符(超过 255 个字节会有 2 字节的额外占用空间开销,所以减 2,如果是 255 以下,则减 1)。
      2)使用 utf-8mb4 字符集,MySQL 中使用 utf-8mb4 字符集一个字符占用 4 个字节,所以 varchar 最大长度是 (65535-2)/4 = 16383 个字符(超过 255 个字节会有 2 字节的额外占用空间开销,所以减 2,如果是 255 以下,则减 1)。

    注:如果使用 utf-8mb4 字符集时,有些需要存储 utf-8 字符的时候,还是会只占 3 字节,所以有时会比这个计算值能存更多个字符,因为 utf-8mb4 是 utf-8 的超集。

    1.2 TEXT

      最大限制也是 64k 个字节,但是本质是溢出存储,InnoDB 默认只会存放前 768 字节在数据页中,而剩余的数据则会存储在溢出段中,虽然也受单表 65535 最大行宽度限制,但 MySQL 表中每个 BLOB 和 TEXT 列实际只占其中的 5 至 9 个字节,其他部分将进行溢出存储。所以实际占用表最大行宽度为 9+2 字节,外加的是额外开销,跟表的实际宽度没有关系:
      1)如果使用 utf-8 字符集,那么单字段占用最大长度也是 21844 个字符。
      2)不过单表可以设置多个 text 字段,这就突破了单表最大行宽度 65535 的限制。

    注:如果采用了新的行格式类型 Barracuda (梭子鱼),该文件格式拥有新的两种行格式(compressed 和 dynamic),两种格式对 blob/text 字段采用完全溢出的方式,数据页中只存放 20 字,,其余的都存放在溢出段中。

    1.3 其他 TEXT

      text 字段是分长中短类型,不像 varchar 只有一种,除了上面的 text,还有下面三个:

    1.3.1 TinyText

      最大长度 255 个字节,实际上是个没什么意义的类型了。

    1.3.2 MEDIUMTEXT

      最大长度限制 16M 个字节。和普通 text 一样也支持溢出存储,所以实际占用表最大行宽度为 9+3 字节,外加的是额外开销。

    1.3.3 LONGTEXT

      最大长度限制 4G 个字节。和普通 text 一样也支持溢出存储,所以实际占用表最大行宽度为 9+4 字节,外加的是额外开销。

    1.4 示例

    # VARCHAR 单表单字段最长不能超过 21844
    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
    
    # 这样就可以了
    CREATE TABLE test(
        va VARCHAR(21844)
    )DEFAULT CHARSET=utf8;
    受影响的行: 0
    时间: 0.155s
    
    # 虽然每个BLOB和TEXT列 账户只占其中的5至9个字节。但是还不够
    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
    
    #然后9+2就可以了
    CREATE TABLE test(
        va VARCHAR(21840),
        tx text
    )DEFAULT CHARSET=utf8;
    受影响的行: 0
    时间: 0.170s
    

    1.5 额外占用空间开销说明

    • varchar 小于 255byte 1byte overhead
    • varchar 大于 255byte 2byte overhead
    • tinytext 0-255 1 byte overhead
    • text 0-65535 byte 2 byte overhead
    • mediumtext 0-16M 3 byte overhead
    • longtext 0-4Gb 4byte overhead

    注:虽然 text 字段会把超过 768 字节的大部分数据溢出存放到硬盘其他空间,看上去是会更加增加磁盘压力。但从处理形态上来讲 varchar 大于 768 字节后,实质上存储和 text 差别不是太大了。因为超长的 varchar 也是会用到溢出存储,读取该行也是要去读硬盘然后加载到内存,基本认为是一样的。
      另外从 8000byte 这个点说明一下,MySQL 的 InnoDB data page 默认一个数据页是 16K,要存两行数据,所以对于 varcahr,,text 如果一行数据不超过 8000byte,overflow 不会存到别的 page 中。

    2 差异点

      text 字段,MySQL不允许有默认值。建立索引必须给出前缀索引长度。
      varchar 允许有默认值,对索引长度没限制。

    注:InnoDB 引擎单一字段索引的默认长度最大为 767 字节,MyISAM 为 1000 字节。例如字符编码是 utf8,那么 varchar 的索引最大长度是 256 个字符。超出限制会导致索引创建不成功,转而需要创建前缀索引。设置InnoDB_large_prefix = 1 可以增大限制,允许索引使用动态压缩,但是表的 row_format 必须是 compressed 或者 dynamic。可以使索引列长度大于767bytes,但是总长度不能大于 3072 bytes。

    3 总结

    • 根据存储的实现:可以考虑用 varchar 替代 text,因为 varchar 存储更弹性,存储数据少的话性能更高。
    • 如果存储的数据大于 64K,就必须使用到 mediumtext,longtext,因为 varchar 已经存不下了。
    • 如果 varchar(255+) 之后,和 text 在存储机制是一样的,性能也相差无几。
    • 需要特别注意 varchar(255) 不只是 255byte,实质上有可能占用的更多。
    展开全文
  • char和varchartext的区别

    千次阅读 2019-08-21 15:21:41
    char和varchartext的区别 区别 1.在MySQL中,char、varchartext类型的字段都可以用来存储字符类型的数据,char、varchar都可以指定最大的字符长度,但text不可以。 2.存储方式和检索方式 存储方式和数据的检索...

    char和varchar,text的区别

    1. 区别

    1.在MySQL中,char、varchar和text类型的字段都可以用来存储字符类型的数据,char、varchar都可以指定最大的字符长度,但text不可以。
    2.存储方式和检索方式
    存储方式和数据的检索方式也都不一样。
    3.按照查询速度:
    char最快, varchar次之,text最慢。
    4.储存长度:
    储存长度
    具体说明:

    一.在新版本的mysql中char(n)和varchar(n)中的n表示的都是字符数
    其中char中的n最大长度是255个字符,如果是utf8编码方式, 那么char类型占255 * 3个字节。(utf8下一个字符占用1至3个字节)
    mysql存储是按字符来计算的,不同编码对应的字节不同;
    UTF-8:一个汉字=3个字节GBK:一个汉字=2个字节

    varchar最大空间是65535个字节, 存放字符数量跟字符集有关系;varchar实际范围是65532或65533, 因为内容头部会占用1或2个字节保存该字符串的长度;如果字段default null(即默认值为空),整条记录还需要1个字节保存默认值null。如果是utf8编码, 那么varchar最多存65532/3 = 21844个字符
    在MySQL中,char、varchar和text类型的字段都可以用来存储字符类型的数据,char、varchar都可以指定最大的字符长度,但text不可以。它们的存储方式和数据的检索方式也都不一样。

    二.详细的区别

    char:存储定长数据很方便,CHAR字段上的索引效率级高,必须在括号里定义长度,可以有默认值,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间(自动用空格填充),且在检索的时候后面的空格会隐藏掉,所以检索出来的数据需要记得用什么trim之类的函数去过滤空格。varchar:存储变长数据,但存储效率没有CHAR高,必须在括号里定义长度,可以有默认值。保存数据的时候,不进行空格自动填充,而且如果数据存在空格时,当值保存和检索时尾部的空格仍会保留。另外,varchar类型的实际长度是它的值的实际长度+1,这一个字节用于保存实际使用了多大的长度。text:存储可变长度的非Unicode数据,最大长度为2^31-1个字符。text列不能有默认值,存储或检索过程中,不存在大小写转换,后面如果指定长度,不会报错误,但是这个长度是不起作用的,意思就是你插入数据的时候,超过你指定的长度还是可以正常插入。

    5.适用范围:
    1、 char长度固定, 即每条数据占用等长字节空间;适合用在身份证号码、手机号码等定。2、 varchar可变长度,可以设置最大长度;适合用在长度可变的属性。3、 text不设置长度, 当不知道属性的最大长度时,适合用text。

    展开全文
  • VARCHARTEXT 长度问题

    万次阅读 2018-01-06 22:18:15
    关于varchartext字段类型的长度问题探究结果 VARCHAR :varchar在mysql中满足最大行限制,也就是 65535(16k)字节,在mysql中使用 uft-8(mysql中的 utf-8 和我们正 常的编码utf-8不同)字符集一个字符占用...
  • ... 最近有表结构设计中出现了varchar(10000)的...1、char(n)和varchar(n)中括号中n代表字符的个数,并不代表字节个数,所以当使用了中文的时候(UTF8)意味着可以插入m个中文,但是实际会占用m*3个字节。 2、同时c.
  • 提示:由于TEXT字段可能会很长,因此Navicat拥有表单视图,为它们提供了更多空间: 总结 我们可以从所有这些中得出的结论是,如果可能的话,应该对255至65k个字符的列使用VARCHAR字段而不是TEXT。 这将可能导致更少...
  • mysql的varchartext对比

    千次阅读 2018-05-28 17:11:57
    大小对比VARCHAR:varchar在mysql中必须满足最大行宽度限制,也就是 65535(64k)字节,而varchar本身是按字符串个数来定义的,在mysql中使用uft-8字符集一个字符占用三个字节,所以单表varchar实际占用最大长度如下....
  • 本文主要用于记录mysql数据库中相同长度的char、varchartext数据在数据库中数据容量对比。 一、char、varchartext的长度基础知识 二、char、varchartext数据容量对比
  • TEXT、TINYTEXT、MEDIUMTEXT、LONGTEXT选择: 储存不区分大小写的字符数据 TINYTEXT 最大长度是 255 (2^8 - 1) 个字符。 TEXT 最大长度是 65535 (2^16 - 1) 个字符。 MEDIUMTEXT 最大长度是 16777215 (2^24 - 1) 个...
  • mysql的char,varchartext类型的区别总结

    万次阅读 多人点赞 2018-01-08 20:33:41
    定义 char(n),代表字符数最大是n,字符数超过n会被截断,超过n的部分丢弃。注意,n是字符,不是字节,数据占用字节数...text(n),这个n写了也没什么用,实际用的时候多数都不写后面的n,直接用text。 存储空间
  • postgresql数据库varchar、char、text的比较 2017年08月04日 09:24:53password-u阅读数:19690 名字 描述 character varying(n),varchar(n) 变长,有长度限制 ...
  • MySQL性能优化之char、varchartext的区别

    万次阅读 多人点赞 2017-09-20 10:53:16
    text/char/varchar的区别
  • 在MySQL中,char、varchartext类型的字段都可以用来存储字符类型的数据,char、varchar都可以指定最大的字符长度,但text不可以。 它们的存储方式和数据的检索方式也都不一样。 数据的检索效率是:char > ...
  • 1、char(n)和varchar(n)中括号中n代表字符的个数,并不代表字节个数,所以当使用了中文的时候(UTF8)意味着可以插入m个中文,但是实际会占用m*3个字节。 2、同时char和varchar最大的区别就在于char不管实际value...
  • MySql中的CHAR、VARCHARTEXT选用

    千次阅读 2017-09-18 12:13:38
    MySql中的CHAR、VARCHARTEXT与BLOB类型1.varchar类型的变化MySQL 数据库的varchar类型在4.1以下的版本中的最大长度限制为255,其数据范围可以是0~255或1~255(根据不同版本数据库来定)。在MySQL5.0以上的版本中,...
  • mysql的char,varchar,text,blob是几个有联系但是有有很大区别的字段类型,这算是mysql的基础吧,可是基础没有学好,恶补一下。 先简单的总结一下: char:定长,最大255个字符 varchar:变长,最大65535个字符...
  • 很多开发者进行数据库设计的时候往往并没有太多的考虑char, varchar类型,有的是根本就没注意,因为存储价格变得越来越便宜了,忘记了最开始的一些基本设计理论和原则,这点让我想到了现在的年轻人,大手一挥一把...
  • char和varchar最大的区别就在于char不管实际value都会占用n个字符的空间,而varchar只会占用实际字符应该占用空间+1,并且实际空间+1<=n。 超过char和varchar的n设置后,字符串会被截断。 char在存储的时候会...
  • SQL中char、varchartext区别

    千次阅读 2018-05-16 15:37:58
    Char为定长,varchartext为变长、1、CHAR。CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间。2、VARCHAR。存储变长数据,...
  • mysql中char和varchartext的区别

    万次阅读 2018-11-11 09:13:23
    ①CHAR是一种固定长度的类型,适合用在身份证号码、...②按照查询速度: char最快, varchar次之,text最慢。 也就是说,定义一个char[10]和varchar[10],如果存进去的是‘csdn’,那么char所占的长度依然为10,除了字...
  • PostgreSQL字符类型:CHAR,VARCHARTEXT

    万次阅读 2019-02-12 15:34:25
    PostgreSQL字符类型:CHAR,VARCHAR和TEXTPostgreSQL字符...本文只要描述PostgreSQL最常见的字符型型文本的三种类型对比CHAR,VARCHARTEXT,对比之间的关系并理解内部关系,方便日后更好地对数据类型进行选择。 ...
  • MySQL 字段类型varchar,CHAR,text

    千次阅读 2016-12-01 20:57:07
    1.varchar类型的变化 ...在 MySQL5.0以上的版本中,varchar数据类型的长度支持到了65535,也就是说可以存放65532个字节的数据,起始位和结束位占去了3个字 节,也就是说,在4.1或以下版本中需要使用固定的TEXT或BLOB
  • 可以用来存储大量的字符串,可以理解为超大的char或者varchar类型。由于是存储字符,所以有字符集的说法。 并且blob和text类型是无法设置默认值的。并且必要时要增大max_allowed_packet的值以适应该数据类型。 上述...
  • mysql列类型char,varchar,text,tinytext,mediumtext,longtext的比较与选择 储存不区分大小写的字符数据 TINYTEXT 最大长度是 255 (2^8 – 1) 个字符。 TEXT 最大长度是 65535 (2^16 – 1) 个字符。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 58,391
精华内容 23,356
关键字:

text占用空间varchar