精华内容
下载资源
问答
  • 今天群里有人问varchar 不是最大应该只可以设置65532(第一个字节+两个长度字节)吗 ,但是为什么可以设置成65533
  • 首先要看数据库的字符集设置成什么了。 如果是gb2312,因为gb2312存放汉字时占两上字节,所以varchar2(200)能放100个汉字, 如果是utf-8,因为utf-8则占用三个字节,所以如果是utf-8则只能存200/3 约= 86 个汉字。 ....

    首先要看数据库的字符集设置成什么了。

    如果是gb2312,因为gb2312存放汉字时占两上字节,所以varchar2(200)能放100个汉字,

    如果是utf-8,因为utf-8则占用三个字节,所以如果是utf-8则只能存200/3 约= 86 个汉字。

    展开全文
  • 今天群里有人问varchar 不是最大应该只可以设置65532(第一个字节+两个长度字节)吗 ,但是为什么可以设置成65533以前一直都认为有两个字节来记录长度(长度小也可以用一个字节记录),所以这个问题当时觉得就挺无聊的...

    今天群里有人问varchar 不是最大应该只可以设置65532(第一个字节+两个长度字节)吗 ,但是为什么可以设置成65533

    以前一直都认为有两个字节来记录长度(长度小也可以用一个字节记录),所以这个问题当时觉得就挺无聊的不过后来群里有人给了解释,突然才发现原来事情不是这么简单

    MYSQL COMPACT格式,每条记录有一个字节来表示NULL字段分布,如果表中有字段允许为空,则最大只能定到65532,如果没有字段允许为空,则那个字节可以节省,最大可以定义到65533,不知道是不是这个原因

    于是上网看了些资料,又在本地做了些实验,原来vachar的最大长度真的是不定的(根据是否有非空字段来决定)

    在本地做了下实验,innodb+latin的环境

    -- success

    drop table if exists test;

    create table test(name varchar(65533) not null)engine=innodb DEFAULT CHARSET=latin1

    -- too large

    drop table if exists test;

    create table test(name varchar(65533))engine=innodb DEFAULT CHARSET=latin1

    对于第二种情况,允许空字段的时候是不能加到65533的长度的,最大只能到65532,到底应该是引文的那种说法。

    网上也有人做了类似的实验,参考http://stackoverflow.com/questions/8295131/best-practise-for-sql-varchar-column-length

    name varchar(100) not null will be 1 byte (length) + up to 100 chars (latin1)

    name varchar(500) not null will be 2 bytes (length) + up to 500 chars (latin1)

    name varchar(65533) not null will be 2 bytes (length) + up to 65533 chars (latin1)

    name varchar(65532) will be 2 bytes (length) + up to 65532 chars (latin1) + 1 null byte

    总结一下,原来mysql的vachar字段的类型虽然最大长度是65535,但是并不是能存这么多数据,最大可以到65533(不允许非空字段的时候),当允许非空字段的时候只能到65532。

    以下是其它网友的补充说明:这不是一个固定的数字。本文简要说明一下限制规则。

    strlen 计算字符串长度,一个中文当2字符

    mb_strlen根据它的字符编码模式,统计字符quot

    count计算数组中的元素数目或对象中的属性个数

    header('Content-Type:text/html;charset=UTF-8');

    $string1="谢春业";//定义中文字符变量

    $string2="xcy";//定义英文字符变量

    //直接输出看看他们的长度

    echo strlen($string1);

    echo "";

    echo strlen($string2);

    echo "";

    //用 php 多字节扩展函数 mb_strlen试试看

    echo mb_strlen($string1,'utf8');

    echo "";

    echo mb_strlen($string2,'utf8');

    echo "";

    ?>

    输出结果是:

    9

    3

    3

    3

    1、限制规则

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

    a) 存储限制

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

    b) 编码长度限制

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

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

    对于英文比较多的论坛 ,使用GBK则每个字符占用2个字节,而使用UTF-8英文却只占一个字节。

    若定义的时候超过上述限制,则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”了。

    展开全文
  • 如果某一项中设置的是varchar(50) mysql varchar(50) 不管中文 还是英文 都是存50个的   转载:https://blog.csdn.net/zhengshg/article/details/64918884 varchar(n),n表示什么? MySQL5.0.3之前varchar...

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

    mysql varchar(50) 不管中文 还是英文 都是存50个的

     

    转载:https://blog.csdn.net/zhengshg/article/details/64918884

    • varchar(n),n表示什么?

    MySQL5.0.3之前varchar(n)这里的n表示字节数

    MySQL5.0.3之后varchar(n)这里的n表示字符数,比如varchar(200),不管是英文还是中文都可以存放200个

     

    • n最大可以是多少

    • MySQL行长度

    MySQL要求一个行定义长度不能超过65535个字节,不包括text、blob等大字段类型,varchar长度受此长度限制,和其他非大字段加起来不能超过65535个字节.

    超过以上限制则会报错

    •  varchar(n)占用几个字节

    varchar(n)占用几个字节跟字符集有关系:

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

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

    • varchar最大长度可以是多少

    根据字符集,字符类型若为gbk,每个字符占用2个字节,最大长度不能超过65535/2 =32766;   字符类型若为utf8,每个字符最多占用3个字节,最大长度不能超过 65535/3 =21845,若超过这个限制,则会自动将varchar类型转为mediumtext或longtext,例如:

    drop table if EXISTS test1111;
    create table test1111(
     id char(255) null,
    content varchar(63000) null
    );
    desc test1111;
     
    结果:
    CREATE TABLE `test1111` (
      `id` char(255) DEFAULT NULL,
      `content` mediumtext
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    展开全文
  • mysql-varchar在设计数据库字段的时候,varchar类型,是不是纠结过到底该设置为多...3、varchar的最大长度多少呢?4、字符、字节、位,之间的关系?5、mysql字段类型存储需要多少字节?6、varchar(10)能存多少个字...
    5cf09792d35a0bb360ec1f5accfabd6e.png

    mysql-varchar

    在设计数据库字段的时候,varchar类型,是不是纠结过到底该设置为多大呢?

    看完这篇文章,你能搞清楚以下问题:

    mysql:

    1、varchar(100)和varchar(10)的区别在哪里?

    2、varchar能存多少汉字、数字?

    3、varchar的最大长度是多少呢?

    4、字符、字节、位,之间的关系?

    5、mysql字段类型存储需要多少字节?

    6、varchar(10)能存多少个字符?

    1、varchar(100)和varchar(10)的区别在哪里?一般初学会认为,二者占用的空间是一样的。比如说我存储5个char,二者都是实际占用了5个char了【不准确的想法:varchar在实际存储的时候会多一个byte用来存放长度】。但是深入一下,设计数据库的时候,二者一样吗?答案是否定的【至少varchar类型需要在数据之前利用一个或者两个字节来存储数据的长度】并且二者在内存中的操作方式也是不同的,下面的例子中有体现如现在用户需要存储一个地址信息。根据评估,只要使用100个字符就可以了。但是有些数据库管理员会认为,反正Varchar数据类型是根据实际的需要来分配长度的。还不如给其大一点的呢。为此他们可能会为这个字段一次性分配200个字符的存储空间。这VARCHAR(100)与VARCHAR(200)真的相同吗?

    结果是否定的。虽然他们用来存储90个字符的数据,其存储空间相同。但是对于内存的消耗是不同的。对于VARCHAR数据类型来说,硬盘上的存储空间虽然都是根据实际字符长度来分配存储空间的,但是对于内存来说,则不是。其是使用固定大小的内存块来保存值。简单的说,就是使用字符类型中定义的长度,即200个字符空间。显然,这对于排序或者临时表(这些内容都需要通过内存来实现)作业会产生比较大的不利影响。我这里大概说下:假设VARCHAR(100)与VARCHAR(200)类型,实际存90个字符,它不会对存储端产生影响(就是实际占用硬盘是一样的)。但是,它确实会对查询产生影响,因为当MySql创建临时表(SORT,ORDER等)时,VARCHAR会转换为CHAR,转换后的CHAR的长度就是varchar的长度,在内存中的空间就变大了,在排序、统计时候需要扫描的就越多,时间就越久。

    所以如果某些字段会涉及到文件排序或者基于磁盘的临时表时,分配VARCHAR数据类型时仍然不能够太过于慷慨。还是要评估实际需要的长度,然后选择一个最长的字段来设置字符长度。如果为了考虑冗余,可以留10%左右的字符长度。千万不能认为其为根据实际长度来分配存储空间,而随意的分配长度,或者说干脆使用最大的字符长度。

    char

    1、从碎片角度进行考虑,使用CHAR字符型时,由于存储空间都是一次性分配的。为此某个字段的内容,其都是存储在一起的。单从这个角度来讲,其不存在碎片的困扰。而可变长度的字符数据类型,其存储的长度是可变的。当其更改前后数据长度不一致时,就不可避免的会出现碎片的问题。故使用可变长度的字符型数据时,数据库管理员要时不时的对碎片进行整理。如执行数据库导出导入作业,来消除碎片。2、考虑其长度的是否相近,如果某个字段其长度虽然比较长,但是其长度总是近似的,如一般在90个到100个字符之间,甚至是相同的长度。此时比较适合采用CHAR字符类型。比较典型的应用就是MD5哈希值。当利用MD5哈希值来存储用户密码时,就非常适和采用CHAR字符类型。因为其长度是相同的。另外,像用来存储用户的身份证号码等等,一般也建议使用CHAR类型的数据。另外请大家考虑一个问题,CHAR(1)与VARCHAR(1)两这个定义,会有什么区别呢?虽然这两个都只能够用来保存单个的字符,但是VARCHAR要比CHAR多占用一个存储位置。这主要是因为使用VARCHAR数据类型时,会多用1个字节用来存储长度信息。这个管理上的开销char字符类型是没有的。

    总结

    二者在磁盘上存储占的空间是一样的。区别有二。第一、一个变长一个固定长度。第二、在内存中的操作方式,varchar也是按照最长的方式在内存中进行操作的。比如说要进行排序的时候,varcahr(100)是按照100这个长度来进行的。

    2、varchar能存多少汉字、数字?具体还是要看版本的,一个字符占用3个字节 ,一个汉字(包括数字)占用3个字节=一个字符

    MySQL 4.0版本以下,varchar(100),指的是100字节,如果存放UTF8汉字时,只能存33个(每个汉字3字节)
    MySQL 5.0版本以上,varchar(100),指的是100字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放100个。

    UTF8编码中一个汉字(包括数字)占用3个字节

    GBK编码中一个汉字(包括数字)占用2个字节

    3、varchar的最大长度是多少呢?mysql的vachar字段的类型虽然最大长度是65535,但是并不是能存这么多数据,最大可以到65533,其中需要1到2个字节来存储数据长度(如果列声明的长度超过255,则使用两个字节来存储长度,否则1个)字节,当不允许非空字段的时候(因为要用一个字节来存储不可为空的标识),当允许非空字段的时候只能到65532(省下了存储非空的那个字节)。

    行中可以用的字节数如下计算:(参考文档:https://www.jianshu.com/p/ee1e4b14c5e7 )

    字段非空时候:varchar(65535) -2 bytes (存储长度,按2个算) - 1byte (latin1类型) - 1 (null byte)=65531 字节可以用

    减1的原因是实际行存储从第二个字节开始’;

    字段可以空时候:varchar(65535) -2 bytes (存储长度,按2个算) - 1byte (latin1类型) =65532 字节可以用

    根据这个最大字节数,以及编码方式,可以计算能存储的汉字数。

    4、字符、字节、位,之间的关系?

    1、位:数据存储的最小单位。每个二进制数字0或者1就是1个位;2、字节:8个位构成一个字节;

    即:1 byte (字节)= 8 bit(位);

    1 KB = 1024 B(字节);1 MB = 1024 KB; (2^10 B)1 GB = 1024 MB; (2^20 B)1 TB = 1024 GB; (2^30 B)

    3、字符:

    a、A、中、+、*、の……均表示一个字符;一般 utf-8 编码下,一个汉字 字符 占用 3 个 字节;数字属于汉字,和汉字占用一样字节。一般 gbk 编码下,一个汉字 字符 占用 2 个 字节;

    5、mysql字段类型存储需要多少字节?

    字段类型:TINYINT----一个很小的整数。有符号的范围是-128到127,无符号的范围是0到255。

    SMALLINT-----一个小整数。有符号的范围是-32768到32767,无符号的范围是0到65535。

    MEDIUMINT----一个中等大小整数。有符号的范围是-8388608到8388607,无符号的范围是0到16777215。

    INT----一个正常大小整数。有符号的范围是-2147483648到2147483647,无符号的范围是0到4294967295。

    INTEGER-----INT的一个同义词。

    BIGINT-------一个大整数。有符号的范围是-9223372036854775808到9223372036854775807,无符号的范围是0到18446744073709551615。

    FLOAT------一个小(单精密)浮点数字。不能无符号。允许的值是-3.402823466E+38到-1.175494351E-38,0 和 1.175494351E-38到3.402823466E+38。M是显示宽度而D是小数的位数。没有参数的FLOAT或有<24 的一个 参数表示一个单精密浮点数字。

    DOUBLE------一个正常大小(双精密)浮点数字。不能无符号。允许的值是-1.7976931348623157E+308到-2.2250738585072014E-308、 0和2.2250738585072014E-308到1.7976931348623157E+308。

    DOUBLE PRECISION、REAL[(M,D)] [ZEROFILL] 这些是DOUBLE同义词。

    DECIMAL------一个未压缩(unpack)的浮点数字。不能无符号。行为如同一个CHAR列:“未压缩”意味着数字作为一个字符串被存储,值的每一位使用一个字符。

    NUMERIC----- 这是DECIMAL的一个同义词。

    DATE -------一个日期。支持的范围是'1000-01-01'到'9999-12-31'。MySQL以'YYYY-MM-DD'格式来显示DATE值,但是允许你使用字符串或数字把值赋给DATE列。

    DATETIME -------一个日期和时间组合。支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。MySQL以'YYYY-MM-DD HH:MM:SS'格式来显示DATETIME值,但是允许你使用字符串或数字把值赋给DATETIME的列。

    TIMESTAMP------一个时间戳记。范围是'1970-01-01 00:00:00'到2037年的某时。一个TIMESTAMP列对于记录一个INSERT或UPDATE操作的日期和时间是有用的,你以可以通过赋给它一个NULL值设置它为当前的日期和时间。

    TIME -----一个时间。范围是'-838:59:59'到'838:59:59'。MySQL以'HH:MM:SS'格式来显示TIME值,但是允许你使用字符串或数字把值赋给TIME列。

    YEAR-----一个2或4位数字格式的年(缺省是4位)。允许的值是1901到2155,和0000(4位年格式),如果你使用2位,1970-2069( 70-69)。MySQL以YYYY格式来显示YEAR值,但是允许你把使用字符串或数字值赋给YEAR列。(YEAR类型在MySQL3.22中是新类型。)

    CHAR------一个定长字符串,当存储时,总是是用空格填满右边到指定的长度。M的范围是 1——255 个字符。当值被检索时,空格尾部被删除。CHAR值根据缺省字符集以大小写不区分的方式排序和比较,除非给出BINARY关键词。NATIONAL CHAR(短形式NCHAR)是ANSI SQL的方式来定义CHAR列应该使用缺省字符集。这是MySQL的缺省。CHAR是CHARACTER的一个缩写。

    VARCHAR------一个变长字符串。注意:当值被存储时,尾部的空格被删除(这不同于ANSI SQL规范)。M的范围是 1——65532 个字符,1个或2个字节用来保存字符串长度。VARCHAR值根据缺省字符集以大小写不区分的方式排序和比较,除非给出BINARY关键词值。VARCHAR是CHARACTER VARYING一个缩写。

    TINYBLOB 、TINYTEXT 一个BLOB或TEXT列,最大长度为255(2^8-1)个字符

    BLOB 、TEXT -----一个BLOB或TEXT列,最大长度为65535(2^16-1)个字符

    MEDIUMBLOB、MEDIUMTEXT ------一个BLOB或TEXT列,最大长度为16777215(2^24-1)个字符

    LONGBLOB 、LONGTEXT ------一个BLOB或TEXT列,最大长度为4294967295(2^32-1)个字符

    ENUM-----枚举。一个仅有一个值的字符串对象,这个值式选自与值列表'value1'、'value2', ...,或NULL。一个ENUM最多能有65535不同的值。

    SET-----一个集合。能有零个或多个值的一个字符串对象,其中每一个必须从值列表'value1', 'value2', ...选出。一个SET最多能有64个成员。

    展开全文
  • Mysql varchar类型长度计算

    千次阅读 2018-03-26 16:49:23
    创建表时,varchar字段的长度最大能设置多少?1,跟字符集GBK,UTF8等有关2,跟当前表所有列总长度有关查看char,varchar字符数,字节长度,十六进制存储select class,char_length(class),length(class),hex(class) ...
  • MySql varchar类型,插入的数据超过设置长度时,超出的部分将会被截取。 varchar所指的自动增长,并不可能超出你所赋与的范围,超出范围的,会被自动截取掉。 它的自动增长,其实应该说是自动缩放,不到你赋的20...
  • 在设计数据库的时候会考虑给字段设置什么类型,设置多少长度合适,之前一直认为varchar(2)可以存储一个汉字,或者一个数字,通过今天无意间的查询,发现了这个错误,来记下来 其实varchar类型可以存储多少个汉字...
  • 你可以像下面这样看一下你的MySQL行格式设置。其实MySQL的数据行有两种格式,一种就是图中的 Compact格式,还有一种是Redundant格式。Compact是一种紧凑的行格式,设计的初衷就是为了让一个数据页中...
  • Navicat如何设置MySQL字段的长度

    万次阅读 2019-07-15 16:06:01
    我们可以使用长度可变的字段类型 varchar 来设置,而且因为 varchar 长度可变,不管我们提前设置的长度比实际所需要的空间大多少都不会浪费空间,所以我们在具体使用时,会把 varchar长度设置为最大长度255, ...
  • varchar(xx)表示多少个字符

    千次阅读 2020-03-27 20:30:05
    在MySql数据库中,如果某个值得字段设置varchar(30)代表的是几个字符呢? 首先,varchar(20)代表的是可以在数据库中存储20个字节的长度,如果存储数据超出了20个字节,多余的部分将不会被存储。 那到底表示存储多少...
  • ASP.NET Core 中使用 MySql,如果字段类型为varchar,不管设置多少长度,插入或更新数据的时候,会自动截断(截取 255 长度的字符)。 出现问题的原因,就是使用了MySql.Data.EntityFrameworkCore程序包(我使用的...
  • 首先是存储长度的不同,char类型在创建表的时候就固定分配好了长度和存储空间,分配多少空间将会占用多少空间,可以设置的最大长度为char(255),当创建好char列之后,如果存储的实际数据没有达到设置长度,MySQL会...
  • 超出char或者varchar设置长度后,字符串会被截断。 char和varchar的区别在于:char不管实际的value值是多少,都会占用n个字符空间,而varchar只会占用实际字符占用的空间+1,并且实际空间+1<=n; 下图可以非常...
  • 解决 ASP.NET Core MySql varchar 字符串截取(长度 255)ASP.NET Core 中使用 MySql,如果字段类型为varchar,不管设置多少长度,插入或更新数据的时候,会自动截断(截取 255 长度的字符)。出现问题的原因,就是使用...
  • 首先是存储长度的不同,char类型在创建表的时候就固定分配好了长度和存储空间,分配多少空间将会占用多少空间,可以设置的最大长度为char(255),当创建好char列之后,如果存储的实际数据没有达到设置长度,MySQL会...
  • 如何计算的 我发现这个长度/值写1,居然也能存进去,或者我要存字符串”你的名字”这4个字,选varchar型的,长度/值又该写多少呢回复讨论(解决方案)只有 varchar、char 类型字段才需要设置宽度,宽度按字符计算注意...
  • 对于 int 类型的一些基础知识其实上图已经说的很明白了,在这里想讨论下常用的 int(11) 代表什么意思,11 代表的并不是长度,而是字符的显示宽度,在字段类型为 int 时,无论你显示宽度设置多少,int 类型能存储的...
  • 在数据库设计中 如何确定一个字段到底应该设置多少位呢? 比如 id varchar(?)//id ip varchar(?)//ip地址 address varchar(?)//归属地 info varchar(?)//个人说明 ...... 怎么有效的确定...
  •  char 类型,无论实际存储多少字符,都占用指定的长度。如果超过则截断 ;varchar 类型,动态分配存储空间,但由于他是从 char 类型派生出来的,所以延用了 char 类型的宽度设置 . 如果你知道
  • 我正在创建一个用于发送私有消息的表单,并希望将文本区域的maxlength值设置为mysql数据库表中text字段的最大长度。一个类型文本字段可以存储多少个字符?如果很多,我是否可以像使用varchar那样在数据库文本类型...
  • 讲一下Navicat的使用varchar 类型的长度是指这个字段的字符(字母或汉字)...不管我们提前设置的长度比实际所需要的空间大多少都不会浪费空间,所以我们在具体使用时,会把 varchar长度设置为最大长度255,数字类型...
  • 讲一下Navicat的使用varchar 类型的长度是指这个字段的字符(字母或汉字)...不管我们提前设置的长度比实际所需要的空间大多少都不会浪费空间,所以我们在具体使用时,会把 varchar长度设置为最大长度255,数字类型...
  • 讲一下Navicat的使用varchar 类型的长度是指这个字段...varchar 长度可变,不管我们提前设置的长度比实际所需要的空间大多少都不会浪费空间,所以我们在具体使用时,会把 varchar长度设置为最大长度255,数字类型...

空空如也

空空如也

1 2 3
收藏数 50
精华内容 20
关键字:

varchar长度设置多少