mysql学习之——基本数据类型

来源:互联网 发布:linux查看内存占用情况 编辑:程序博客网 时间:2024/05/12 07:45

 

mysql基本数据类型

 

1 数值 

 

整数类型有5种

 

TINYINT   1字节

SMALLINT  2字节

MEDIUMINT 3字节

INT       4字节

BIGINT    8字节

 

声明数据类型时候可以制定数据的现实宽度M(1-255),就是数据类型括号里面的值如:BIGINT(3),M为3只是限制显示,并不能限制数据的大小

 

浮点数

 

FLOAT  4字节

DOUBLE 8字节

DECIMAL M+2字节

 

浮点数由M(显示宽度)D(小数位数)共同控制取值范围

 

ps:如何选择数据类型,根据具体的数据大小来选择合适的类型,如果超出数据的取值范围,mysql会自动截短数据,对于浮点数小数位会被D(小数位)四舍五入,DECIMAL类型是以字符串存储的,不会被四舍五入,适合对精度要求较高的场合

 

数值类型的属性

ZEROFILE,如果数值小于定义的宽度,将在数值前面填充0

UNSIGNED,数据为无符号

AUTO_INCREMENT 属性可生成独一无二的数字序列,只对整数类的数据有效

 

create table test(id int not null primary key auto_increment, value varchar(16) not null) auto_increment = 100;

 

必须是主键的key才能设置为auto_increment

NULL和NOT NULL 数据列是否为空

DEFAUL可为属性列制定默认值

 

2 字符串

 

字符串的长度M是表示最多可以容纳M字节字符组成的字符串,对于单字节字符来说就是容纳M个字符,对于多字节会少于M个字符

 

char 

varchar

varcha的长度L+1,是因为varchar是自动变长的,多出来的一位存储长度,当一个数据表里有一项是varchar,mysql会将其他项的char自动转化成varchar,但是4字节以下的char不会转

 

blob和text

blob是二进制字符串,text是非二进制字符串,两者都可以存储大量的信息

 

enum和set虽然是字符串,但是mysql是以数值形式存储

比较特殊的字符串,他们的取值范围是预先定义好的列表中的值

enum只能是列表中的一个值,从1开始

set可以取多值,最多64个成员,空字符也是合法的SET值

 

3 时间数据类型

 

date time datatime timestamp

timestamp 定义为default current_timestamp 在插入一条记录时不制定时间,将自动赋为当前时间

定义为on update current_timestamp, 那么修改一条记录时,将自动被修改为当前时间'

current_timestamp 还可以用current_timestamp(),now(),localtime(),localtimestamp,localtimestamp(),null,来代替

 

create table test(ts timestamp default current_timestamp);

 

year 为1字节,2位或者4位数字格式的年,1901-2155,70-69(1970-2069)

 

4 如何选择数据类型

 

要存放的数据类型

 

数据值的取值范围

 

数值比字符串操作快

 

小类型的处理速度比大类型快

 

不同数据表中固定和可变长度的处理效率不同

 

可变长度类型在经过删除和修改操作后容易产生碎片,降低系统性能,需要定期运行optimize_table命令进行优化

 

固定长度类型由于有固定的长度,容易确定每条记录的起始点,可加快数据表的修复速度

 

在myisam表中使用固定长度有助改善数据库性能

 

在innodb表中,固定长度和可变长度数据类型都以相同方式存储

 

可以建索引来加快数据库的查询速度

 

可明确指定not null属性,使mysql在检索过程中不判断NULL,加快速度

 

5 使用auto_increment时应注意:

只有整数列才可指定为auto_increment属性

 

最好指定为unsigned,可以多一倍序号

 

必须为not null

 

必须有唯一索引,以避免重复

 

当进行全表删除时,auto_increment会从1重新开始 

truncate table table_name

用delete from table_name 则不会

这是因为全部操作时,mysql会先删除索引,然后再删除数据,重建数据表,如果要保留原序号信息,可以delete frome table_name where 1;

 

如果需要强制mysql不重复使用序列值,那么需要另外建一个auto_increment序列的数据表,并永远不删除该表的记录

insert into id set id = NULL;

insert into main set main_id =  LAST_INSERT_ID();

可以用alter命令给一个数据表增加一个具有auto_increment属性的数据列

alter table test add new_id int(8) not null unsigned auto_increment,add primary key(new_id);