mysql笔记集锦3

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('加','是');









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章