Mysql中varchar长度设置⽅法
如果某⼀项中设置的是varchar(50)
那么对英⽂当然是50
那么对中⽂呢
utf-8的中⽂占3个字节
那么,这个varchar(50)是不是只能存16个汉字了?
mysql varchar(50) 不管中⽂还是英⽂都是存50个的
MySQL5的⽂档,其中对varchar字段类型这样描述:varchar(m) 变长字符串。M 表⽰最⼤列长度。M的范围是0到65,535。(VARCHAR的最⼤实际长度由最长的⾏的⼤⼩和使⽤的字符集确定,最⼤有效长度是65,532字节)。
为何会这般变换?真是感觉MySQL的⼿册做的太不友好了,因为你要仔细的继续往下读才会发现这段描述:MySQL 5.1遵从标准SQL规范,并且不删除VARCHAR值的尾部空格。VARCHAR保存时⽤⼀个字节或两个字节长的前缀+数据。如果VARCHAR列声明的长度⼤于255,长度前缀是两个字节。
好了,貌似懂了⼀点。但具体他说的长度⼤于255时使⽤2个字节长度前缀,⼩学减法题:65535 - 2 = 65533啊。不知道这些⼤⽜如何计算的,暂且保留疑问吧?
注:我测试了⼀下使⽤UTF8编码,varchar的最⼤长度为21854字节。
在mysql 5.0.45版本,数据库编码utf8下进⾏测试:varchar最长定义为21785。也就是说不论字母、数字、汉字,只能放21785个。
推想:varchar字节最⼤65535,utf8编码⼀个字符3个字节65535/3=21785。
补充知识:
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合适,关键是根据实际情况到权衡点。
varchar2最大长度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语句中的字段,考虑加索引,整形的尤其适合加索引。
以上所述是⼩编给⼤家介绍的Mysql中varchar长度设置⽅法,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。在此也⾮常感谢⼤家对⽹站的⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。