精华内容
下载资源
问答
  • 那么来验证下 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最大占用空间,以及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字节的空间时,表可以创建成功。其他的类型基本都是固定字节的,所以就不再实验,有兴趣的可以自己试试。

    展开全文
  • 那么来验证下 varchar 类型的实际最大长度: 测试环境:MySQL版本 5.7.19 //首先要设置下 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 不能指定默认值。

    展开全文
  • mysql5.0.3及以前版本varchar类型最大长度是255字符,之后版本理论上长度可取值范围是1到65535字节,但实际上不可能取到这么大的值,原因是65535字节是mysql1行数据占用长度。所以单个字段是不可能占用这么大的...

    mysql5.0.3及以前版本varchar类型最大长度是255字符,

    之后版本理论上长度可取值范围是1到65535字节,但实际上不可能取到这么大的值,原因是65535字节是mysql1行数据占用的长度。所以单个字段是不可能占用这么大的空间的。

    那如果是你设置的值过大,mysql怎么处理呢?

    根据设置的sql_mode不同会有两种情况:

    mysql会把varchar类型转成text类型并产生一个warning;

    MySQL报错;

    学习回复

    @喂马:如果utf8的话一行最大长度为21845,gbk的32767,然后多字段平分?回复

    @苏生不惑:这个是和字符集有关系的,因为65535指的是字节,所以具体能有多少个字符你可以尝试一下如果一行只有一个字段,那就可以到65535了?

    你的mysql知识上哪学的?

    体育老师教的?

    varchar最大255.

    回复

    @小虫0302:真不知道你们怎么当上程序员的呵呵,你的经验是老黄历了。确认一下你mysql的版本?

    1118是行的长度过长,这个异常返回的说明里面会告诉你限制是多少,和mysql版本,引擎和编码都有关系。不过你这个语句在5.6上执行我并没有发现有报错。

    引用来自“逝水fox”的答案

    1118是行的长度过长,这个异常返回的说明里面会告诉你限制是多少,和mysql版本,引擎和编码都有关系。不过你这个语句在5.6上执行我并没有发现有报错。

    我测试了下mysql5.0.45按你的sql执行后没问题

    mysql>descnewtable;+-------------+------------------+------+-----+---------+----------------+|Field|Type|Null|Key|Default|Extra|+-------------+------------------+------+-----+---------+----------------+|goods_id|int(11)unsigned|NO|PRI|NULL|auto_increment||cat_id|int(11)|YES||NULL|||type_id|int(11)|YES||NULL|||brand_id|int(11)|YES||NULL|||goods_brand|varchar(200)|YES||NULL|||goods_brief|varchar(1000)|YES||NULL|||goods_info|varchar(2000)|YES||NULL|||goods_price|int(10)|YES||NULL||+-------------+------------------+------+-----+---------+----------------+8rowsinset(0.01sec)

    mysql>insertintonewtablesetgoods_info='MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0';QueryOK,1rowaffected(0.00sec)

    mysql>selectlength(goods_info)fromnewtablewheregoods_id=1;+--------------------+|length(goods_info)|+--------------------+|680|+--------------------+1rowinset(0.00sec)

    引用来自“苏生不惑”的答案

    我测试了下mysql5.0.45按你的sql执行后没问题

    mysql>descnewtable;+-------------+------------------+------+-----+---------+----------------+|Field|Type|Null|Key|Default|Extra|+-------------+------------------+------+-----+---------+----------------+|goods_id|int(11)unsigned|NO|PRI|NULL|auto_increment||cat_id|int(11)|YES||NULL|||type_id|int(11)|YES||NULL|||brand_id|int(11)|YES||NULL|||goods_brand|varchar(200)|YES||NULL|||goods_brief|varchar(1000)|YES||NULL|||goods_info|varchar(2000)|YES||NULL|||goods_price|int(10)|YES||NULL||+-------------+------------------+------+-----+---------+----------------+8rowsinset(0.01sec)

    mysql>insertintonewtablesetgoods_info='MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0MyISAMDEFAULTCHARACTERSET=utf8COLLATE=utf8_general_ciCHECKSUM=0';QueryOK,1rowaffected(0.00sec)

    mysql>selectlength(goods_info)fromnewtablewheregoods_id=1;+--------------------+|length(goods_info)|+--------------------+|680|+--------------------+1rowinset(0.00sec)

    为啥不用text类型?顶我是来看评论的

    引用来自“mark35”的答案

    为啥不用text类型?

    展开全文
  • 时间 char的存取数度还是要比varchar要快得多,因为其长度固定,方便程序的存储与查找; char也为此付出的是空间的代价,因为其长度固定,所以难免会有多余的空格占位符...定义一个char[10]和varchar[10], 如果...
  • varchar(20)和varchar(255)的空间开销区别

    千次阅读 2019-08-03 10:45:57
    也就是说varchar(20)和varchar(255)对应的索引长度分别为203(utf-8)(+2+1),2553(utf-8)(+2+1),其中"+2"用来存储长度信息,“+1”用来标记是否为空,加载索引信息时用varchar(255)类型会占用更多的内存; (备注:当...
  • 以上是针对MySQL 5.6版本,不保证之前的版本也有同样的行为。 总结一下: ...建表时定义的CHAR(n)...既然是字符,当然不同字符集会占用不同的存储空间,如果是字符集是latin1,1个字符对应1个字节,如果字符集
  • 首先从占用空间进行比较,varchar(10) 声明10个字节,数据保存时额外一个字节的长度前缀;varchar(1000)声明1000个字节,如果数据长度大于255,长度前缀是两个字节。而实际Varchar数据类型是根据实际的需要来分配...
  • 在mysql教程中char与varchar的区别呢,都是用来存储...char与varchar的区别char (13)长度固定, 如'www.jb51.net' 存储需要空间 12个字符varchar(13) 可变长 如'www.jb51.net' 需要存储空间 13字符,小识备注char(10...
  • varchar和char

    2014-03-18 13:19:36
    占用存储空间varchar是可变长度,char是定长。 比如:varchar(20)的字段存"123"需要 4 个字节来存储,多一个字节来记录长度。  char(20)的字段存"123"需要20个字节来存储。 建议固定长度的字段用char...
  • varchar类型的存储特点: varchar用于存储变长字符串,只占用必要的存储...varchar长度的选择问题: 使用最小的符合需求的长度 varchar(5)varchar(200)存储mysql字符串性能不同 varchar的适用场景: 字符串的...
  • char和varchar的区别:1、占据空间不同:char的长度是不可变的,而varchar长度是可变的;2、存取速度不同:char的存取数度比varchar要快得多,因为其长度固定,方便程序的存储与查找;3、存储方式不同:char的存储...
  • 比如说我存储5个char,二者都是实际占用了5个char了【勘误:varchar在实际存储的时候会多一个byte用来存放长度】。但是深入一下,设计数据库的时候,二者一样吗?答案是否定的【至少varchar类型需要在数据之前利用一...
  • varchar(255)与varchar(80)都是保持可变的字符串,当使用ROW_FORMAT=FIXED创建MyISAM表时,会为每行使用固定的长度空间,这样设置不同的varchar长度值时,存储相同数据所占用空间是不一样。 另外虽然通常情况下...
  • MySQL数据库的字符(串)类不要以为字符类型就是...而VARCHAR则是可变长度的,如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为VARCHAR(10)是最合算的,VARCHAR类型的占用空间是它...
  • 比如说我存储5个char,二者都是实际占用了5个char了【勘误:varchar在实际存储的时候会多一个byte用来存放长度】。 但是深入一下,设计数据库的时候,二者一样吗? 答案是否定的【至少varchar类型需要在数据之前利用...
  • 1.char和varchar最大的区别就在于char不管实际value都会占用n个字符的空间,而varchar只会占用实际字符应该占用的字节空间 2.超过char和varchar的n设置后,字符串会被截断。 3.char的上限为255字节,varchar的上限...
  • MySQL中CHAR和VARCHAR

    2016-08-19 14:50:23
    MySQL数据库的字符(串)类不要以为字符类型就是CHAR,...而VARCHAR则是可变长度的,如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为VARCHAR(10)是最合算的,VARCHAR类型的占用空间是它
  • varchar和char的区别——时间换空间空间换时间! 在最近的数据库学习中,varchar、char、null出现率比较高,借此机会把学到的总结一番相互学习。 char是一种固定长度的类型,char(x)类型的数据列里,每个值都占用...
  • MySQL数据库的字符(串)类不要以为字符类型就是CHAR,...而VARCHAR则是可变长度的,如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为VARCHAR(10)是最合算的,VARCHAR类型的占用空间是它
  • char和varchar区别

    2017-11-13 16:42:44
    varchar是变长类型,存储长度就是实际字符串的长度,存 储的时候会占用额外的空间来保存记录长度;  即char一定会使用指定的空间varchar是根据数据来定空间 ②存储长度:char的长度为0到255,varchar长度为:...
  • 二者操作内存的方式不同:对于varchar数据类型来说,硬盘上的存储空间虽然都是根据字符串的实际长度来存储空间的,但在内存中是根据varchar类型定义的长度来分配占用的内存空间的,而不是根据字符串的实际长度来分配...
  • CHAR VARCHAR 类型CHAR 类型用于定长字符串,并且必须在圆括号内用一个大小修饰符来定义。这个大小修饰符的范围从 0-255。比指定长度大的值将被截短,而比指定长度小的值将会用空格作填补。CHAR 类型可以使用 ...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 249
精华内容 99
关键字:

varchar长度和占用空间