精华内容
下载资源
问答
  • 如果被 varchar 超过上述的 b 规则,被强转成 text 类型,则每个字段占用定义长度为 11 字节,当然这已经不是 varchar
  • 那么来验证下varchar类型的实际最大长度:  测试环境:MySQL版本 5.6.17 //首先要设置下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语句中的字段,考虑加索引,整形的尤其适合加索引。

    展开全文
  • 1.建立测试表 2.插入测试数据 3.执行sql select dump(COLUMN_NUMBER), lengthb(COLUMN_...3时,采用number类型存储占用空间相对VARCHAR2是要小的。当然,number类型的大小是有限制的,最长为NUMBER(38); ...
    1.建立测试表

    在这里插入图片描述

    2.插入测试数据

    在这里插入图片描述

    3.执行sql
    select dump(COLUMN_NUMBER), lengthb(COLUMN_VARCHAR2), lengthb(COLUMN_VARCHAR)from TEST ORDER BY COLUMN_NUMBER
    

    在这里插入图片描述
    由结果可见,当数字类型长度>=3时,采用number类型存储占用的空间相对VARCHAR2是要小的。当然,number类型的大小是有限制的,最长为NUMBER(38);

    展开全文
  • MySQL的varchar长度问题

    万次阅读 2019-09-11 17:21:35
    导致实际应用中varchar长度限制的是一个行定义的长度。 MySQL要求一个行的定义长度不能超过65535。若定义的表长度超过这个值,则提示 ERROR 1118 (42000): Row size too large. The maximum row size for the ...

    https://www.cnblogs.com/joeblackzqq/p/4633862.html

     

    From: http://blog.csdn.net/longyulu/article/details/7863737

    http://dinglin.iteye.com/blog/914276

    http://www.cnblogs.com/fakis/archive/2011/03/07/1976532.html

    如果某一项中设置的是varchar(50)

    那么对英文当然是50

    那么对中文呢

    utf-8的中文占3个字节

    那么,这个varchar(50)是不是只能存16个汉字了?

     

    不是这样的,mysql低版本之前是这样的,但是5.0以后就不是了

    mysql varchar(50)  不管中文 还是英文 都是存50个的,但是一个表中所有varchar字段的总长度跟编码有关,如果是utf-8,那么大概65535/3,如果是gbk,那么大概65535/2.

     

    MySQL5的文档,其中对varchar字段类型这样描述:varchar(m) 变长字符串。M 表示最大列长度。M的范围是0到65,535。(VARCHAR的最大实际长度由最长的行的大小和使用的字符集确定,最大有效长度是65,532字节)。

    为何会这般变换?真是感觉MySQL的手册做的太不友好了,因为你要仔细的继续往下读才会发现这段描述:MySQL 5.1遵从标准SQL规范,并且不删除VARCHAR值的尾部空格。VARCHAR保存时用一个字节或两个字节长的前缀+数据。如果VARCHAR列声明的长度大于255,长度前缀是两个字节。

     

     MySQL中varchar最大长度是多少?这不是一个固定的数字。本文简要说明一下限制规则。

    1、限制规则

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

    a)  存储限制

    varchar 字段是将实际内容单独存储在聚簇索引之外,实际存储从第二个字节开始,接着要用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535。

    b)  编码长度限制

    字符类型若为gbk,每个字符最多占2个字节

    字符类型若为utf8,每个字符最多占3个字节

    若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。

    c)  行长度限制

    导致实际应用中varchar长度限制的是一个行定义的长度。 MySQL要求一个行的定义长度不能超过65535。若定义的表长度超过这个值,则提示

    ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs。

     

    2、计算例子

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

    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-30*3)/3=21812

    减1和减2与上例相同;

    减4的原因是int类型的c占4个字节;

    减30*3的原因是char(30)占用90个字节,编码是utf8。

           如果被varchar超过上述的b规则,被强转成text类型,则每个字段占用定义长度为11字节,当然这已经不是“varchar”了。

     

    ===========================================================

    From: http://www.cnblogs.com/doit8791/archive/2012/05/28/2522556.html

     

    今天新开始的项目在做数据库设计,发现自己对MySql的varchar类型还不熟悉,故又上网收集资料整理如下。

    1.varchar类型的变化

    MySQL 数据库的varchar类型在4.1以下的版本中的最大长度限制为255,其数据范围可以是0~255或1~255(根据不同版本数据库来定)。在 MySQL5.0以上的版本中,varchar数据类型的长度支持到了65535,也就是说可以存放65532个字节的数据,起始位和结束位占去了3个字 节,也就是说,在4.1或以下版本中需要使用固定的TEXT或BLOB格式存放的数据可以使用可变长的varchar来存放,这样就能有效的减少数据库文 件的大小。

    MySQL 数据库的varchar类型在4.1以下的版本中,nvarchar(存储的是Unicode数据类型的字符)不管是一个字符还是一个汉字,都存为2个字 节 ,一般用作中文或者其他语言输入,这样不容易乱码 ;varchar: 汉字是2个字节,其他字符存为1个字节 ,varchar适合输入英文和数字。

    4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) ;5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是 65532字节 ;varchar(20)在Mysql4中最大也不过是20个字节,但是Mysql5根据编码不同,存储大小也不同,具体有以下规则:

    a) 存储限制

    varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535。

    b) 编码长度限制

    字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;

    字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。

    若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。

    c) 行长度限制

    导致实际应用中varchar长度限制的是一个行定义的长度。 MySQL要求一个行的定义长度不能超过65535。若定义的表长度超过这个值,则提示

    ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs。

    2.CHAR(M), VARCHAR(M)不同之处

    CHAR(M)定义的列的长度为固定的,M取值可以为0~255之间,当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检 索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义 char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充。

    VARCHAR(M)定义的列的长度为可变长字符串,M取值可以为0~65535之间,(VARCHAR的最大有效长度由最大行大小和使用 的字符集确定。整体最大长度是65,532字节)。VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则 使用两个字节)。VARCHAR值保存时不进行填充。当值保存和检索时尾部的空格仍保留,符合标准SQL。varchar存储变长数据,但存储效率没有 CHAR高。如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为什么"+1"呢?这一个字节用于保存实际使用了多大的长度。 从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。

    CHAR和VARCHAR最大的不同就是一个是固定长度,一个是可变长度。由于是可变长度,因此实际存储的时候是实际字符串再加上一个记录 字符串长度的字节(如果超过255则需要两个字节)。如果分配给CHAR或VARCHAR列的值超过列的最大长度,则对值进行裁剪以使其适合。如果被裁掉 的字符不是空格,则会产生一条警告。如果裁剪非空格字符,则会造成错误(而不是警告)并通过使用严格SQL模式禁用值的插入。

    3. VARCHAR和TEXT、BlOB类型的区别

    VARCHAR,BLOB和TEXT类型是变长类型,对于其存储需求取决于列值的实际长度(在前面的表格中用L表示),而不是取决于类型 的最大可能尺寸。例如,一个VARCHAR(10)列能保存最大长度为10个字符的一个字符串,实际的存储需要是字符串的长度 ,加上1个字节以记录字符串的长度。对于字符串'abcd',L是4而存储要求是5个字节。

    BLOB和TEXT类型需要1,2,3或4个字节来记录列值的长度,这取决于类型的最大可能长度。VARCHAR需要定义大小,有65535字节的最大限制;TEXT则不需要。如果你把一个超过列类型最大长度的值赋给一个BLOB或TEXT列,值被截断以适合它。

    一个BLOB是一个能保存可变数量的数据的二进制的大对象。4个BLOB类型TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB仅仅在他们能保存值的最大长度方面有所不同。

    BLOB 可以储存图片,TEXT不行,TEXT只能储存纯文本文件。4个TEXT类型TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT对应于 4个BLOB类型,并且有同样的最大长度和存储需求。在BLOB和TEXT类型之间的唯一差别是对BLOB值的排序和比较以大小写敏感方式执行,而对 TEXT值是大小写不敏感的。换句话说,一个TEXT是一个大小写不敏感的BLOB。

    4.总结char,varchar,text区别

    长度的区别,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语句中的字段,考虑加索引,整形的尤其适合加索引。

    转载于:https://my.oschina.net/u/2615680/blog/3076996

    展开全文
  • 那么来验证下 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 不能指定默认值。

    展开全文
  • varchar和char 的区别,varchar最大长度

    千次阅读 2019-07-04 15:39:43
    一. varchar存储规则: 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) 5.0版本以上,varchar(20),指的... varchar和char 的区别: char是一种固定长度的类型,varcha...
  • VARCHARvarchar在mysql中满足最大行限制,也就是 65535(16k)字节,在mysql中使用 uft-8(mysql中的 utf-8 我们正 常的编码utf-8不同)字符集一个字符占用三个字节, ①使用 utf-8 字符编码集varchar 最大长度是...
  • 那就得有保存长度的地方,所以如果VARCHAR长度设置在255以下,那只会使用额外一个字节来保存长度,但是如果VARCHAR长度设置在255以上,那么就会使用额外的两个字节来保存长度,无形中就浪费了存储空间。...
  • 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)类型会占用更多的内存; (备注:当...
  • - 字符 人们使用的记号,抽象意义上的一个符号。一个汉字英文就是一个字符,如'1', '中', 'a', '$', '¥',…… - 字节 计算机中存储数据的单元,一个8位的二进制数,是一个很具体的存储空间,如0x01, 0x45, 0...
  • 知道之后不要默认每个字段都这样写了,varchar(255)和varchar(100)保存相同长度字符串磁盘使用空间一样,但是处理数据时使用的内存不一样,效率不一样的。
  • MySQL中varchar最大长度是多少?

    千次阅读 2020-05-07 23:41:03
    MySQL中varchar最大长度是多少? 一. varchar存储规则: 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) 5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、...
  • 先说结论,mysql 中的 varchar 是有最大长度限制的,这个值是 65535 个字节。varchar(100),这个 100 的单位是啥,这个单位其实在不同版本中是不一样的。在早...
  • 使用varchar(5)和varchar(200)存储‘hello’的空间开销是一样的,那么使用更短的列有什么优势吗? 事实证明有很大的优势。更长的列会消耗更多的内存,因为MySQL通常会分配固定大小的内存块来保存内部值。尤其是在...
  • sql nvarchar(max)性能空间分析与varchar(n)/nvarchar(n) 长度性能及所占 空间分析 varchar(n),nvarchar(n) 中的n怎么解释:  nvarchar(n)最多能存n个字符,不区分中英文。  varchar(n)最多能存n个字节,一...
  • VARCHAR的最大长度、字符串类型选择,用MySQL的人中十之七八是不清楚的。网上文章鱼目混珠,以讹传讹居多。 本文不止介绍了原理,还提供了案例手把手教你自己分析,彻底解决你的疑惑
  • MySQL中varchar字段最大长度是多少

    千次阅读 2020-12-31 10:55:40
    文章目录背景字节字符的区分为什么是varchar(255)而不是(256)varchar字段最大值是多少latin1字符集编码下utf8字符集编码下utf8mb4字符集编码下总结 背景 你是否知道MySQL中的varchar字段类型最大能够存储多少数据...
  • 数据库中varchar类型 最大长度是多少?

    万次阅读 多人点赞 2019-10-09 20:57:00
    varchar存储规则: 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) 5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),...
  • 同事在设计表,有一个字段为发票号码,在一般来讲发票号码的长度一般是8位,varchar类型, 他的意思是给20位,我的意思是给少点12位就够了。又因为我们在老的业务里给的是12位,出现过存储的字段过长而导致未能存储...
  • mysql varchar(N)长度如何选择

    千次阅读 2020-05-02 11:35:44
    varchar 存储分为两部分: varchar字段长度 = 字符串长度值 + 实际数据长度 N。 字符串长度值视实际数据长度,需占用 1 或 2 个字节存储。...varchar主要根据字段实际使用长度来分配存储空间 在...
  • 字符,计算机中使用的字母、数字、字符号等。 编码 一个英文字母占用的字节 一个中文汉字占用的字节 ASCII 码 1 2 Unicode 1 2 符号 1 2 UTF-8 1 3 UTF-16 2 2(unicode扩展区的一些汉字存储需要...
  • 使用varchar(5)和varchar(200)存储‘hello’的空间开销是一样的,那么
  • 导致实际应用中varchar长度限制的是一个行定义的长度。 MySQL要求一个行的定义长度不能超过65535。若定义的表长度超过这个值,则提示 ERROR 1118 (42000): Row size too large. The maximum row size for the ...
  • 最近在整理代码规范,按照之前oracle的习惯,定了以下的字段长度设定规范: 名称字段:varchar(200) 较长的名称字段/简介字段:varchar(500) 特别长的描述字段: varchar(2000) 超过2000中文字的字段:text 为...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 64,928
精华内容 25,971
关键字:

varchar长度和占用空间