mysql记录长度:
mysql中规定任何一条记录长度最长不超过65535字节,(varchar永远达不到理论值)
varchar实际存储长度能达到多少呢?看字符集编码
utf8下varchar的实际顶配21844字符:
gbk下的varchar的实际顶配32766字符:
-- 求出varchar在utf8和gbk下的实际最大长度:
create table my_utf8(
name varchar(65535)
)charset utf8;
create table my_gbk(
name varchar(65535)
)charset gbk;
提示长度太大并给出了最大长度。
根据给出的最大长度进行创建:
-- 求出varchar在utf8和gbk下的实际最大长度:
create table my_utf8(
name varchar(21845)
)charset utf8;
create table my_gbk(
name varchar(32767)
)charset gbk;
计算出最大长度:
-- 求出varchar在utf8和gbk下的实际最大长度:
create table my_utf8(
name varchar(21844) -- 应该为21844,所占字节21844*3+2=65532+2=65534
)charset utf8;
create table my_gbk(
name varchar(32766) -- 应该为32766,所占字节32766*3+2=65532+2=65534
)charset gbk;
如上计算出来了65534,还剩余一个字节,用完整个65535字节,增加一个tinyint字段:
增加一个tinyint发现失败:
create table my_utf81(
age tinyint,
name varchar(21844) -- 应该为21844,所占字节21844*3+2=65532+2=65534
)charset utf8;
create table my_gbk1(
age tinyint,
name varchar(32766) -- 应该为32766,所占字节32766*3+2=65532+2=65534
)charset gbk;
mysql记录中:如果有任何一个字段允许为空,那么系统会自动从整个记录中保留一个字节来存储NULL(想释放NULL所占用的字节,必须保证所有的字段都不允许为空)
-- 释放NULL
create table my_utf82(
age tinyint not null,
name varchar(21844) not null
)charset utf8;
create table my_gbk2(
age tinyint not null,
name varchar(32766) not null
)charset gbk;
mysql中text字符串,不占用记录长度,额外存储,但是text文本字符串也是属于记录的一部分,一定需要占据记录中的部分长度:10个字节(保存数据的地址和长度)
-- text占用10个字节长度
create table my_text(
name varchar(21841) not null,
content text
)charset utf8;
-- 解决问题证明了text占用10个字节
create table my_text(
name varchar(21841) not null, -- 21841 * 3 + 2 = 65523 + 2 = 65525
content text not null -- 10
)charset utf8;
列属性:
列属性:真正约束字段的是数据类型,但是数据类型的约束很单一,需要有一些额外的约束,来更加保证数据的合法性。
列属性有很多:NULL/not NULL,default,Primary key,unique key,auto_increment,comment.
空属性:
两个值:NULL(默认的)和NOT NULL(不为空),虽然默认的数据库基本都是字段为空,但是实际上在真实开发的时候
尽可能的要保证所有的数据都不为空,空数据没有意义没办法参与运算。
创建一个实际案例表:班级表(名字,教室)
-- 创建班级表
create table my_class(
name varchar(20) not null, -- 考虑实际边界值,不为空
room varchar(20) -- 不加not null,就是默认允许为空
)charset utf8;
列描述:
列描述:comment,描述,没有实际含义,是专门用来描述字段,会根据表创建语句保存;
来给数据库管理员来进行了解的(也即一些注释,我们写代码的时候要注意注释因为这个也是互相分享的,注重代码分格)
-- 创建表
create table my_teacher(
name varchar(20) not null comment '姓名',
money decimal(10,2) not null comment '工资'
)charset utf8;
desc my_teacher;
show create table my_teacher;
列属性(默认值):
默认值:某一种数据会经常性的出现某一个值。可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值。
默认值关键字:default
-- 默认值
create table my_default(
name varchar(20) not null,
age tinyint unsigned default 0,
gender enum('男','女','保密') default '男'
)charset utf8;
默认值的生效:在数据进行插入的时候,不给数据进行赋值。
-- 插入数据
insert into my_default (name) values('薛飞龙');
select * from my_default;
想要使用默认值,可以不一定去指定列表,故意不使用字段列表,可以使用default 关键字代替值。
insert into my_default values('项媛媛',18,default);
select * from my_default;