这篇博客主要来学习mysql中的字段类型。在sql中将数据类型分成了3大类:数值类型,字符串类型,日期类型。
数值型数据:都是数值,系统将数值分为整数型和小数型
整数型用来存放整型。整数型又分为下面五种:
Tinyint:
迷你整型,用一个字节来存储,最多表示256种
Smallint:
小整型,使用两个字节来存储,最多表示65536种
Mediumint:
中整型,使用3个字节来存储。
Int
标准整型,使用4个字节来存储。
Bigint
大整形,使用8个字节存储。
在sql中的数值类型默认都是有符号的,即有正负之分,有时候,需要使用无符号数据:
需要给数据类型限定:int unsigned ,从0开始
小数型:带有小数点或者范围超出整型的数值类型。在sql中将小数型又分为两种:浮点型和定点型。
浮点型数据是一种精度型数据,因为超出指定范围之后,会丢失精度(会自定的四舍五入).
浮点型理论上分为两种:
- float:单精度,占用4个字节存储数据,精度范围大概7位左右。
- double: 双精度,占用8个字节存储数据,精度范围大概15位左右。
创建浮点数表:浮点的使用方式:直接使用float表示没有小数部分;float(M,D),M代表总长度,D代表小数部分长度。整数部分长度=M-D
-- 创建浮点数表
create table my_float( f1 float, f2 float(10,2), f3 float(6,2) )charset utf8;
-- 插入数据
insert into my_float values(1000.10,1000.10,1000.10); --符合条件
insert into my_float values(99999999,99999999.99,9999.99); --符合条件
注意:整数部分是不能超过设定的长度的,但是小数部分会自动四舍五入
-- 超出长度插入
-- 小数部分超出
insert into my_float values(99999999,999.9955555555,99.995555);
-- 整数部分超出
insert into my_float values(99999999,12323123999.99,1234599.91);
浮点数会进行四舍五入(超出精度范围),浮点数如果是因为系统进位导致整数部分超出指定的长度,那么系统也不会出错
定点型,绝对的保证整数部分不会被四舍五入(不会丢失精度),小数部分有可能丢失精度。
-- 创建定点数表
create table my_decimal( f1 float(4,2), d1 decimal(4,2) )charset utf8;
定点数的整数部分一定不能够超出长度,但是小数部分的长度可以随意超出(系统自动四舍五入)
-- 插入数据
-- 有效数据
insert into my_decimal values(12.90,12.90);
-- 小数部分超出
insert into my_decimal values(12.1898,12.99999);
-- 定点为超出
-- 有效数据
insert into my_decimal values(99.99,99.99);
-- 浮点数超出,进位导致出错
insert into my_decimal values(99.99,99.999);
-- 创建时间日期表
create table my_date( d1 datetime, d2 date, d3 time, d4 timestamp, d5 year )charset utf8;
-- 插入数据
insert into my_date values('2016-3-14 15:44:17','2016-3-14','15:44:55','2016-3-14 15:45:37',2016);
-- time使用负数
insert into my_date values('2016-3-14 15:44:17','2016-3-14','-15:44:55','2016-3-14 15:45:37',2016);
-- 当负数小于24小时的时候,表示时间段
insert into my_date values('2016-3-14 15:44:17','2016-3-14','-115:44:55','2016-3-14 15:45:37',2016);
-- '-1 15:44:55' 表示过去一天
insert into my_date values('2016-3-14 15:44:17','2016-3-14','-1 15:44:55','2016-3-14 15:45:37',2016);
-- year可以使用两位或者四位
insert into my_date values('2016-3-14 15:44:17','2016-3-14','-1 15:44:55','2016-3-14 15:45:37',69);
insert into my_date values('2016-3-14 15:44:17','2016-3-14','-1 15:44:55','2016-3-14 15:45:37',70);
timestamp:只要当前所在记录被更新,该字段一定会自动更新为当前时间
在sql中,将字符串类型分为六大类:
定长字符串:char,指的是在定义结构的时候就已经确定了最终数据的存储长度。
char(L): L表示存储的长度。最大长度为255.
char(4): 在utf8环境下,需要4*3 = 12个字节
变长字符串:varchar,在分配空间的时候,按照最大的空间分配,但是会根据最终的数据来确定,最终使用的大小。
varchar(L) : L表示字符长度
如果数据量非常大,通常情况下,超过255个字符就会使用文本字符串。文本字符串根据存储的数据的格式分为两类:
枚举:enum,事先将所有的结果都设计好,实际上存储的数据必须是规定的数据中的一个。
-- 枚举的使用方式
定义: enum(可能出现的元素列表); //如:enum('男','女');
使用: 存储数据,只能存储上面定义好的数据。
-- 创建枚举表
create table my_enum(
gender enum('boy','girl')
)charset utf8;
-- 插入数据
insert into my_enum values('boy'),('girl');
-- 插入错误数据
insert into my_enum values('male');
我们可以通过为枚举类型+0,就可以判断原来的数据存储的到底是字符串,还是数值,如果是字符串,最终结果永远是0,否则就是其他值
-- 将字段结果取出来,进行+0运算
select gender+0,gender from my_enum;
根据上面的案例,我们应该可以总结出:枚举在进行数据规范的时候,系统会自动建立一个数字,与枚举元素的对应关系,然后在进行数据插入的时候,系统自动将字符转换成对应的数字存储,然后在数据提取的时候,系统自动将对应的数值转换成字符串显示。
-- 使用数值插入枚举
insert into my_enum values(1),(2);
集合类似于枚举:实际存储的是数值(集合是多选的)
-- 集合的使用方式
定义: set(元素列表) 使用: 可以使用多个元素列表中的元素,使用逗号分隔 -- 创建集合表 create table my_set( loves set('唱歌','跳舞','聊天','运动','吹牛','写代码') )charset utf8;
-- 插入数据
insert into my_set values('唱歌,聊天,写代码');
-- 按照数值插入
insert into my_set values(3);
列属性用来约束要存储的数据,用来保证数据的合法性。
列描述:是用来描述字段的,会根据表创建语句保存。
-- 创建my_teacher表
create table my_teacher( name varchar(20) not null comment '老师姓名', salery decimal(10,2) not null comment '工资' )charset utf8;
-- 创建默认值表
create table my_default( name varchar(20) not null, age tinyint unsigned default 18, gender enum('男','女') default '男' )charset utf8;
-- 插入默认值
insert into my_default (name) values('张三');
insert into my_default values('李四',22,'女');
ok,今天就暂时到这里了。