出自: http://blog.csdn.net/ReadyYes/article/details/51105978
The maximum row size for the used table
type, not counting BLOBs, is 65535.
表的一行除去二进制,最大存储长度为65535字节。
–本文的分析基于mysql
1.char
char(4); //这个4表示最多存储4个【字符】,
长度可以为从0到255的任何值,当存储的字符串长度小于指定的长度,
会在字符串的右边填充空格达到指定的长度,当查询字符串的时候会删除右边空格
①在严格模式下,插入超过指定长度会报错
insert into c1 values ('你好世界');//你好世界是4个字符
insert into c1 values ('abcd');//abcd四个字符
create table c1(c char(4));
insert into c1 values ('abcde');
②char可以指定最大长度为 255
create table c2(c char(255));
③char存储的字符串在查询的时候会去掉右边空格
insert into c1 values ('ab ');
select concat(c,'#'),length(c) from c1;
2.varchar
varchar(4)//这个4表示最多存储4个【字符】,
长度可以指定为0到65535之间的值(VARCHAR的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是65,532字节),
VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)
红色字体的描述摘自Mysql手册,看着感觉犯晕。
varchar(M) —-这个M的值可以取哪些值 ??
#创建一个数据库
create database db4 charset=utf8;
use db4;
create table v1( v varchar(65532));
这个错误提示信息 max = 21845 :
是指varchar 在utf8编码的情况下能指定的最大长度是varchar(21845) ?
max = 21845 是 65535 / 3 (uft8编码mysql存储的最大长度)= 21845 ?
来执行一句:
create table v1( v varchar(21845));
create table v1( v varchar(21844));
varchar(21844) 执行是成功的,varchar(21845) 失败是因为要留2个字节来记录varchar中保存的字符串长度。
再搞一个gbk的数据库试试:
create database db5 charset=gbk;
use db5;
create table v1( v varchar(65532));
这个max = 32767 , 是 65535/2(GBK编码mysql存储的最大长度) = 32627 ?
create table v1( v varchar(32767));
依旧提示错误,
create table v1( v varchar(32766));
varchar(32766)是可以成功的,varchar(32767)失败是因为要留2个字节记录varchar中存储的字符串长度。
3.表的一行最大存储长度为65535什么意思?
在utf8编码的数据库,执行下面的sql语句:
create table vc(c1 char(255),v1 varchar(21844),v2 varchar(21844));
改成这样:
create table vc(c1 char(3),v1 varchar(21800),v2 varchar(40));
由此可见:表的一行记录中 char 和 varchar的 所有字段存储长度受65535字节制约。
4. 总结
- char适用于确定长度的字符串:如:邮政编码,手机号码;
- varchar适用于不确定字符串的长度,比如:商品名称,标题;
- char速度较快,但比较耗费空间,char(m)当实际存储字符串长度小于限定m大小的时候,会用空格右边填充达到m长度;
- varchar(m)根据实际存储字符串长度来决定占用空间;
- varchar(m)的m的取值大小跟数据库的编码有关,gbk编码下,中文占2个字节,uft8编码下,中文占用3个字节
- 表的一行记录中 char 和 varchar的 所有字段存储长度受65535字节制约
- text类型不占据表格中的数据容量限制,最长可存储65535个字符,实际应用中,字符长度大可考虑使用text类型。