char 和 varchar 区别与分析

13 篇文章 0 订阅

出自: 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. 总结

  1. char适用于确定长度的字符串:如:邮政编码,手机号码;
  2. varchar适用于不确定字符串的长度,比如:商品名称,标题;
  3. char速度较快,但比较耗费空间,char(m)当实际存储字符串长度小于限定m大小的时候,会用空格右边填充达到m长度;
  4. varchar(m)根据实际存储字符串长度来决定占用空间;
  5. varchar(m)的m的取值大小跟数据库的编码有关,gbk编码下,中文占2个字节,uft8编码下,中文占用3个字节
  6. 表的一行记录中 char 和 varchar的 所有字段存储长度受65535字节制约
  7. text类型不占据表格中的数据容量限制,最长可存储65535个字符,实际应用中,字符长度大可考虑使用text类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值