Day3列类型与建表
1 理解
(1)知识点:列类型;
a:怎么建表:以在A4纸上建表为例,例子略;
b:分析:我们只要把表头建好了,这张表就算是建好了;
其实建表的过程,就是一个画表头的过程;
即:建表的过程就是一个声明字段的过程;
(2)建表和列类型的关系?
a:分析:A4纸的大小是有限的,那么每列的长度应该留多 宽呢?
b:因此:对应的,空间有限,我们在建列时,我们想到的 就是能够容纳放置的内容,但是又不能浪费;
c:存储同样的数据,不容的列类型,所占据的空间和效率 是不一样的,这就是我们建表前要列类型的意义;
(3)重点:学习列类型的存储范围与占据的字节关系;
2. 列类型学习
Mysql三大列类型:
(1)数值型:
a 整型
Tinyint
占据空间:一个字节;存储范围:-12 8~127,0-255;
声明tinyint怎么样表示有符号和无符号?
int系列的声明时的参数:
(M)unsigned zerofill;
//#分析M参数
//#zerofill zero是零,fill是填充,代表0;
M必须和zerofill配合使用才有意义;
给学员添加一个学号:
1:学号不能为负;
2:学号一般位数相同,即使不同,如:00012,11123;
3:即使不够位数,用0填充;
#例子:
alter table class
add snum smallint<5> zerofill not null
default 0;
//snum统一补0,而且补到5位;
#M表示补0的宽度,和zerofill配合使用才有意义;
#unsigned zerofill :观察snum类型,可知zerofill则同时必是 unsigned类型;
#练习tinyint的参数并验证字节与范围的关系:
create table class(
sname varchar(20) not null default '',
age tinyint not null default 0//age is tinyint;
)engine myisam charset utf8;
insert into class(sname,age)
values
('coo',111);//Query ok;
('aaa',128);//out of range;
#即:不加特殊说明,默认是有符号的;
#加unsigned表示无符号,可以影响存储的范围;
alter table class //修改表,添加score为unsigned;
add score tinyint unsigned not null default 0;
# 测试范围:
insert into class(sname,score)
values
('jj',200);//query ok;
('hh',-1);//out of range;
*加列类型加unsigned表明是无符号类型;
#为其插入数据,age到底是-128到127,还是0-255呢?
二进制补码问题:
负数 = 绝对值 - 128;
Smallint
Mediuint
int
bigint
b 小数(浮点型/定点型)
#浮点数在计算机里表示是比较复杂的;
a float(M,D)
小数点的左边和小数点的右边?即范围;
#12.23;13.255;
#M代表“标度”---》代表小数的总位数;
D代表“精度”---》代表小数点右边的位数(小数位);
代码示例:
create table salary(
sname varchar(20) not null default '',
gongzi float(6,2)
)engine myisam charset utf8;
#添加奖金列:
alter table salary
add
bonus float(5,2) unsigned not null default 0;
#浮点数占多大的空间呢:
//float能存储10^38,10^-38; 如果M<=24,占4个字节,否则占8个字节;
#用来表示数据中的小数出来float--浮点,
还有一种叫定点,定点就是把整数部分和小数部分分开存储的,比float精确;decimal;
b decimal(M,D)
代码示例:
create table account(
id int not null default 0,
acc1 float(9,2) not null default 0.00,
acc2 decimal(9,2) not null default 0.00
)engine myisam charset utf8;
示例:
insert into account
values
(1,1234567.23,1234567.23);
#通过上例可以看出float有损精度,decimal无损精度;
//decimal:如果像账户这样的敏感字段,建议用decimal;
字符串型:
char,varchar,text,blob;
char(4):定长字符串;
varchar:变长字符串类型;
#姓名 char(6)
za
ji
ii
#查找记录时,如果都是定长的话,完全可以通过行数和行的长度计算 出来文件指针的偏移量;
对于定长N,不论够不够指定长度,实际都占据N个长度;
如果不够就用空格在尾部补齐;
varchar(100),也是可以存储0-100个字符;
#“za”开始出,请把za取出来,往后去取几个字符呢??
/// 对于varchar(M),不用空格补齐,但列内容前,实际是要加上(1-2)个字节来标记内容长度;
示例代码:
create table test(
va char(6) not null default '',
vs varchar(6) not null default ''
)engine myisam charset utf8;
//
insert into test
values
('aa ' ,'aa '); //空格
//
#concat 连接字符串的函数
select concat(va,'!'),concat(vs,'!')
from test;
//如果不够的时候就用空格补齐,取出时再把右侧空格删除(如果内容用空格,将会被清除);
//如果右侧有空格,取出的时候就会有缺失;
##两者限制的是字符,不是字节;
注意事项:
// char(2) charset utf8,M指能存两个字符,如“奖金”;
//错误认识:既然是字符,6个utf8中文,即是12个字节,可以存12个英文字母?
##不对,也只是能存六个字母而已;
text:文本类型,一般用来储存文章内容,新闻内容等;声明text列时,不必给默认值;
示例代码:
create table test2(
arti text not null default ''
);//error
arti text);//Ok
blob:是进制类型,是用来存储图像,音频等二进制信息;二进制,0-255都有可能出现,Blob在于防止因为字符集的问题,导致信息丢失;
比如:一张图片有0xFF字节,这个在ascii字符集认为非法,在入库的时候被过滤了;
示例代码:
alter table test2
add
img blob;//添加列img,类型是blob;
//
insert into test2
values('加','是');
1 理解
(1)知识点:列类型;
a:怎么建表:以在A4纸上建表为例,例子略;
b:分析:我们只要把表头建好了,这张表就算是建好了;
其实建表的过程,就是一个画表头的过程;
即:建表的过程就是一个声明字段的过程;
(2)建表和列类型的关系?
a:分析:A4纸的大小是有限的,那么每列的长度应该留多 宽呢?
b:因此:对应的,空间有限,我们在建列时,我们想到的 就是能够容纳放置的内容,但是又不能浪费;
c:存储同样的数据,不容的列类型,所占据的空间和效率 是不一样的,这就是我们建表前要列类型的意义;
(3)重点:学习列类型的存储范围与占据的字节关系;
2. 列类型学习
Mysql三大列类型:
(1)数值型:
a 整型
Tinyint
占据空间:一个字节;存储范围:-12 8~127,0-255;
声明tinyint怎么样表示有符号和无符号?
int系列的声明时的参数:
(M)unsigned zerofill;
//#分析M参数
//#zerofill zero是零,fill是填充,代表0;
M必须和zerofill配合使用才有意义;
给学员添加一个学号:
1:学号不能为负;
2:学号一般位数相同,即使不同,如:00012,11123;
3:即使不够位数,用0填充;
#例子:
alter table class
add snum smallint<5> zerofill not null
default 0;
//snum统一补0,而且补到5位;
#M表示补0的宽度,和zerofill配合使用才有意义;
#unsigned zerofill :观察snum类型,可知zerofill则同时必是 unsigned类型;
#练习tinyint的参数并验证字节与范围的关系:
create table class(
sname varchar(20) not null default '',
age tinyint not null default 0//age is tinyint;
)engine myisam charset utf8;
insert into class(sname,age)
values
('coo',111);//Query ok;
('aaa',128);//out of range;
#即:不加特殊说明,默认是有符号的;
#加unsigned表示无符号,可以影响存储的范围;
alter table class //修改表,添加score为unsigned;
add score tinyint unsigned not null default 0;
# 测试范围:
insert into class(sname,score)
values
('jj',200);//query ok;
('hh',-1);//out of range;
*加列类型加unsigned表明是无符号类型;
#为其插入数据,age到底是-128到127,还是0-255呢?
二进制补码问题:
负数 = 绝对值 - 128;
Smallint
Mediuint
int
bigint
b 小数(浮点型/定点型)
#浮点数在计算机里表示是比较复杂的;
a float(M,D)
小数点的左边和小数点的右边?即范围;
#12.23;13.255;
#M代表“标度”---》代表小数的总位数;
D代表“精度”---》代表小数点右边的位数(小数位);
代码示例:
create table salary(
sname varchar(20) not null default '',
gongzi float(6,2)
)engine myisam charset utf8;
#添加奖金列:
alter table salary
add
bonus float(5,2) unsigned not null default 0;
#浮点数占多大的空间呢:
//float能存储10^38,10^-38; 如果M<=24,占4个字节,否则占8个字节;
#用来表示数据中的小数出来float--浮点,
还有一种叫定点,定点就是把整数部分和小数部分分开存储的,比float精确;decimal;
b decimal(M,D)
代码示例:
create table account(
id int not null default 0,
acc1 float(9,2) not null default 0.00,
acc2 decimal(9,2) not null default 0.00
)engine myisam charset utf8;
示例:
insert into account
values
(1,1234567.23,1234567.23);
#通过上例可以看出float有损精度,decimal无损精度;
//decimal:如果像账户这样的敏感字段,建议用decimal;
字符串型:
char,varchar,text,blob;
char(4):定长字符串;
varchar:变长字符串类型;
#姓名 char(6)
za
ji
ii
#查找记录时,如果都是定长的话,完全可以通过行数和行的长度计算 出来文件指针的偏移量;
对于定长N,不论够不够指定长度,实际都占据N个长度;
如果不够就用空格在尾部补齐;
varchar(100),也是可以存储0-100个字符;
#“za”开始出,请把za取出来,往后去取几个字符呢??
/// 对于varchar(M),不用空格补齐,但列内容前,实际是要加上(1-2)个字节来标记内容长度;
示例代码:
create table test(
va char(6) not null default '',
vs varchar(6) not null default ''
)engine myisam charset utf8;
//
insert into test
values
('aa ' ,'aa '); //空格
//
#concat 连接字符串的函数
select concat(va,'!'),concat(vs,'!')
from test;
//如果不够的时候就用空格补齐,取出时再把右侧空格删除(如果内容用空格,将会被清除);
//如果右侧有空格,取出的时候就会有缺失;
##两者限制的是字符,不是字节;
注意事项:
// char(2) charset utf8,M指能存两个字符,如“奖金”;
//错误认识:既然是字符,6个utf8中文,即是12个字节,可以存12个英文字母?
##不对,也只是能存六个字母而已;
text:文本类型,一般用来储存文章内容,新闻内容等;声明text列时,不必给默认值;
示例代码:
create table test2(
arti text not null default ''
);//error
arti text);//Ok
blob:是进制类型,是用来存储图像,音频等二进制信息;二进制,0-255都有可能出现,Blob在于防止因为字符集的问题,导致信息丢失;
比如:一张图片有0xFF字节,这个在ascii字符集认为非法,在入库的时候被过滤了;
示例代码:
alter table test2
add
img blob;//添加列img,类型是blob;
//
insert into test2
values('加','是');