mysql的数据类型,列类型,字段类型
三大类:数值,字符串,日期时间。
数值
-
整数int
int占4字节,其他占用空间情况:
如何选择:通过叶无逻辑判断,常见tinyint,int。mysql的整形,有php整形不具备的概念:
无符号:只能表示整形或者0。那么最大的整数会很大。
默认是有符号的,可通过整形的unsigned选项,int unsigned设置整形无符号。
显示宽度:显示宽度,不决定整型的范围。而决定在显示出该数之后,如果宽度不够,则采用前导零不齐!此时需要额外的属性 zerofill 来设置!mysql中,没有布尔型!但是存在Boolean这个关键字,表示 tinyint(1)。典型的,0表示假,1表示真。
浮点数float double
单精度,float,4字节;
双精度,double,8字节。
在定义浮点数,典型的需要指明其有效位数,和小数位数
float(M,D)
double(M,D)
M:所有的有效位数
D:其中的小数位数
以上两个值,决定一个浮点数的有效范围!定点数 decimal
小数点是固定的,decimal与定义浮点数一致,也有有效位数与小数位数的概念。
decimal(M,D);
存储形式不是数值的形式存储,类似于字符串的形式存储。
注意:关于小数,
1.支持科学计数法;
2.支持unsigned无符号数;
3.支持zerofill。
字符串类型
- char
最基本(定长)的字符串类型,用于保存长度固定的内容,速度快,但是保存变长数据会浪费空间。 -
varchar
可变长度的字符串,用于保存长度可变的数据,保存变成数据时,节省空间,处理起来麻烦些。char(L),varchar(L)
L,表示每个数据的最大长度!单位是字符数(不是字节数)L的值不是多大都可以!
有最大值:
1,mysql一条记录最大不能超过65535个字节!(字段的长度加起来,不能超过这个值)
2,长度单位是字符数,与编码是相关的!
utf8编码最大为21845,gbk为32767在使用时,varchar 超过255就选择 text来保存!
-
text
文本,不限长度的字符串,不需要制定长度,而且也不会算入到记录的总长度内。选择:
定长:char;
边长较短(255)个字符内:carchar;
变长,较长:text。 -
枚举,enum,单选
需要在定义枚举类型是,列出哪些是可能的。create table type_enum_1(
gender enum('male','female','secret')--insert的值只能三选一
);处理时类似字符串类型操作。
意义:
1.限定性的可能性;
2.速度快,比普通的字符串速度快;原因是枚举型是利用整数进行管理的,能2个字节进行管理;
每个值都是一个整数标识,从第一个选项开始为1,逐一递增,管理时整数的形式,速度比字符串快。
2 个字节,0-65535,因此可以有 65535个选项可以使用! -
集合,set,复选
类似于枚举,定义时也需要指定其已有值。
与字符串相比,优势是:
1.也是采用整数进行管理的,采用位运算,从第一位开始为1,注意x2;create table type_set_1(
hobby set('male','female','secret','other')
);-- 1 2 4 8_10002.每个集合类型8个字节64位,因此可以表示64个元素。
注意:站在mysql的角度,尽量多用枚举和集合,站在php操作mysql的角度,尽量少用,兼容性差。
日期时间
-
datetime
用于保存大范围的日期时间,’1000-01-01 00:00:00’到’9999-12-31 23:59:59’
在处理时是使用字符串的形式进行管理。 timestamp
时间戳,管理常用的典型时间,从1970-1-1开始。空间少,而且是以整形的形式管理,但是一个字符串的形式展示出来的。date
日期,如果只记录日期,不记录时间,采用date。year
在保存年份的时候,采用一个字节保存,因此只能表示1901–2155年。-
time
时间,时间时刻。还可以表示时间跨度时间段的概念。总结:
1.除了time,都是时间点的概念,time还表示时间跨度。
2.年份的表示:
可以采用2位年份 0-69表示20xx 70-99表示19xx
3.除了-还有:可以作为日期和时间的分隔符外还有很多其他字符都可以。
在PHP程序中:小范围的日期使用整形,大范围的日期使用字符串。
列属性
- NULL,not null属性空约束
mysql的NULL不是属性,也不是类型,只是标识属性,用于说明某个字段是够以为null(是否可以什么都不存)。
NULL采用关键字NULL表示(不是字符串)。
如果,在添加数据时,没有指定值,也可能会是NULL。 - default属性,默认值约束
采用 default 关键字,来限定一个字段的默认值,在没有指定字段数据时,采用默认值。
default 与 null 的处理关系:
如果此时,该字段被指定了一个null:不能使用默认值,允许为null则为null,不允许则插入失败。
如果一个字段没有指定默认值,那么默认为NULL。
应用:
典型在很多表上增加一个 update_time 将其默认值设置成 current_timestamp。就可以记录下当前记录的最后操作时间。
create table default(
id int not null,
birthday timestamp default current_timestamp
);
字段约束
- 主键约束/唯一约束,primary unique
都是索引的一种。
主键:可以唯一标识记录的字段,称之为主键;
唯一:保证在某个字段上的数据是唯一的,可以设置为唯一约束;
一个表中只能有一个主键,可以有多个唯一约束。
典型的,在创建表时,主动增加一个非实体的自然属性,充当主键,采用整型,运算速度快。
-
主键建立:两套方案;
create table primary_1(
id int primary key, --在前添加
name varchar(10)
);
create table primary_2(
id int ,
name varchar(10),
primary key (id) --在后添加
);一旦创建了主键,就不能为空。
-
唯一建立
使用unique key来创建create table unique_1(
id int primary key,
name varchar(10) unique key --在前添加
);
create table unique_2(
id int ,
name varchar(10),
primary key (id),
unique key (name) --在后添加
);注意:主键或者是唯一,都可以由多个字段组成。
因此,主键与字段的概念:字段来充当主键,不是字段就是主键!(称之为复合主键)尽量采用 id 一个来作为主键。 -
管理主键/唯一
删除主键
alter table 表名 drop primary key;添加主键
alter table 表名 add primary key(‘字段列名’);删除唯一
alter table 表名 drop index 索引名字(字段列表);
索引的名字可以通过show create table 看到;- 增加唯一
alter table 表名 add unique key 索引名字(字段列表);
自动增长auto_increment
用于主键,只有一个字段主键,才能使用auto_increment,从1开始逐一递增。
目的是保证唯一,计算方便。
注意:unsigned不是列属性,是类型的一部分(包括zerofill)因此位置上与类型在一起。
下面写法不正确
id int auto_increment unsigned primery key,
—-unsigned应放于int后,属于属性部分注释,comment
注意
哪些地方可以设置编码?
1.建表,建库,建字段时可以设置编码(数据库中的数据的编码);
2.PHP作为mysql服务器的客户端,设置的客户端编码和连接编码(set names);
3.设置PHP返回给浏览器数据的编码(Content-Type,header(),《meta标签》);
4.PHP文件本身保存的编码(文件编码,通过文本编辑器设置)。
浏览器查看时可以强制制定编码。