mysql数据库–mysql的数据类型(时间日期类型+字符串类型)

时间日期类型:

Datetime:时间日期,格式是YYYY-mm-dd HH:ii:ss,表示的范围是从1000到9999年,有0值:0000-00-00 00:00:00。
Date:日期,就是datetime中的date部分。
Time:时间段,指定的某个区间之间,-时间到+时间。
Timestamp:时间戳,只是从1970年开始的YYYY-mm-dd HH:ii:ss 格式与datetime完全一致。
Year:年份,两种格式, year(2)和year(4):1901到2156

创建时间日期表:

create   table   my_date(
d1 datetime,
d2 date,
d3 time,
d4 timestmp,
d5 year
)charset utf8;

mysql数据库--mysql的数据类型(时间日期类型+字符串类型)

插入数据:时间time可以是负数,而且可以是很大的负数,year可以使用两位数插入,也可以使用4位数

-- 插入数据
insert into my_date values('2018-10-29 09:32:28','2018-10-29','09:33:32','2018-10-29 09:34:18',2018);
-- 时间使用负数
insert into my_date values('2018-10-29 09:32:28','2018-10-29','-9:33:32','2018-10-29 09:34:18',2018);
insert into my_date values('2018-10-29 09:32:28','2018-10-29','-209:33:32','2018-10-29 09:34:18',2018); -- 表示的是一个时间段
insert into my_date values('2018-10-29 09:32:28','2018-10-29','-2 09:33:32','2018-10-29 09:34:18',2018); -- -2表示过去两天

-- year可以使用两位或者四位
insert into my_date values('2018-10-29 09:32:28','2018-10-29','09:33:32','2018-10-29 09:34:18',69);
insert into my_date values('2018-10-29 09:32:28','2018-10-29','09:33:32','2018-10-29 09:34:18',70);

-- 查看数据
select * from my_date;

Timestamp字段:只要当前所在的记录被更新,该字段一定会自动更新成当前时间:

-- 查看数据
select * from my_date;

-- timestamp:修改记录
update my_date set d1 = '2018-10-29 09:58:35' where d5 = 2069;
select * from my_date;

Timestamp的存储:

网站是以PHP为实现的主要操作对象:PHP中有强大的日期处理函数:date,只需要一个时间戳就可以转换成任意类型的
时间:以PHP为主的时候,都是在数据库使用时间戳(整型)来存储时间。

字符串类型:

在SQL中,将字符串类型分成了6类:char,varchar,text,blob,enum和set

char类型定长字符串:

定义字符串:char,磁盘(二维表)在定义结构的时候,已经确定了最终数据的存储长度。
char(L):L代表length,可以存储的长度,单位为字符,最大长度为255.
char(4):在UTF8环境下,需要4*3=12个字节。

补充一下字节和字符的关系:

字节(Byte): 
字节是通过网络传输信息(或在硬盘或内存中存储信息)的单位。
字节是计算机信息技术用于计量存储容量和传输容量的一种计量单位,1个字节等于8位二进制。
一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间.
符号:英文标点占一个字节,中文标点占两个字节.

字符是人们使用的记号,抽象意义上的一个符号。 '1', '中', 'a', '$', '¥', ……
字节 计算机中存储数据的单元,一个8位的二进制数,是一个很具体的存储空间。 0x01, 0x45, 0xFA, ……
ANSI 字符串 在内存中,如果“字符”是以 ANSI 编码形式存在的,一个字符可能使用一个字节或多个字节来表示,
那么我们称这种字符串为 ANSI 字符串或者多字节字符串。
"中文123"(占7字节)
UNICODE 字符串 在内存中,如果“字符”是以在 UNICODE 中的序号存在的,那么我们称这种字符串为 UNICODE 字符串或者
宽字节字符串。
L"中文123"(占10字节)
由于不同 ANSI 编码所规定的标准是不相同的,因此,对于一个给定的多字节字符串,我们必须知道它采用的是哪一种编码规则,
才能够知道它包含了哪些“字符”。而对于 UNICODE 字符串来说,不管在什么环境下,它所代表的“字符”内容总是不变的。

变长字符串:

varchar,在分配空间的时候,按照最大的空间分配,但是实际上用了多少,是根据具体的数据来确定。
varchar(L):L表示字符长度,理论是65536个字节,但是会多出一到两个字节来确定存储的实际长度。但是实际上如果长度超过
255,既不使用定长也不使用变长,使用文本字符串text。
varchar(10):的确存了10个汉字,utf8环境,10*3+1=31.关于这里为啥加1,L<255时候+1,反之+2.
若存储了3个汉字:3*3+1=10个字节
定长与变长的存储实际空间(UTF8)

mysql数据库--mysql的数据类型(时间日期类型+字符串类型)

如何选择定长或者变长字符串呢?

当数据的长度是固定的使用定长,定长的磁盘空间比较浪费但是效率高;变长的磁盘空间比较节省但是效率低下。如果数据
基本上确定长度都一致,就是使用定长,如:身份证,电话号码,手机号码等。如果数据不能确定长度(不同数据有变化)
如:姓名,家庭住址等使用变长。

文本字符串:text

如果数据量特别大,比如超过了255个字符就会使用文本字符串,文本字符串根据存储的数据的格式进行分类:text和blob
text:存储文字(二进制数据实际上都是存储路径)
blob:存储二进制数据(通常不用)

列类型:枚举字符串

enum:事先将所有可能出现的结果都设计好,实际上存储的数据必须是规定好的数据中的一个。
枚举的使用方式:
定义:enum(可能出现的元素列表);//如enum(‘男’,‘女’,‘不男不女’,‘妖’,‘保密’);
使用:存储数据,只能存储上面定义好的数据。

mysql数据库--mysql的数据类型(时间日期类型+字符串类型)

创建枚举表:

-- 创建枚举表
create table my_enum(
gender enum('男','女','保密')
)charset utf8;

desc my_enum;

mysql数据库--mysql的数据类型(时间日期类型+字符串类型)

加入数据:作用之一:规范数据格式:数据只能是规定数据中的其中一个。

-- 插入数据
insert into my_enum values('男'),('保密'); -- 有效数据
-- 错误数据
insert into my_enum values('male'); -- 错误,没有该元素

mysql数据库--mysql的数据类型(时间日期类型+字符串类型)

作用之二:节省存储空间(枚举的别名:单选框)

在数据库中系统也是自动转换数据格式的,基本与PHP一样(尤其是字符串转数字),枚举实际存储的是数值而不是字符串本身。
证明字段存储的数据是数值:将数据取出来+0就可以判断出原来的数据存的到底是字符串还是数值,如果是字符串最终结果永远
为0,否则就是其他值。
-- 将字段结果取出来进行+0操作
select gender + 0, gender from my_enum;
找出了枚举元素的实际规律:按照元素出现的顺序,从1开始编号。

mysql数据库--mysql的数据类型(时间日期类型+字符串类型)

枚举的原理:

枚举在进行数据规范的时候(定义的时候),系统会自动建立一个数字与枚举元素的对应关系(关系放到日志中);然后在
数据进行插入的时候,系统会自动将字符转换成对应的数字进行存储,然后在进行数据提取的时候,系统自动将数值转换成
对应的字符串进行显示。

因为枚举实际存储的是数值,所以可以直接插入数值:

-- 数值插入枚举元素
insert into my_enum values(1),(2);

-- 将字段结果取出来进行+0操作
select gender + 0, gender from my_enum;

mysql数据库--mysql的数据类型(时间日期类型+字符串类型)

集合字符串:

集合跟枚举很类似,实际存储的是数值,而不是字符串(集合是多选)
集合使用方式:定义,set(元素列表);使用:可以使用元素列表中的元素(多个),使用逗号分隔

创建集合表:

-- 创建集合表
create table my_set(
hobby set('篮球','足球','乒乓球','羽毛球','排球','台球','网球','棒球')
)charset utf8;

desc my_set;

插入数据:可以使用多个元素字符串集合,也可以直接插入数值。

-- 插入数据
insert into my_set values('足球,台球,网球');
insert into my_set values(3);

mysql数据库--mysql的数据类型(时间日期类型+字符串类型)

查看数据:数值+数据查看

--98转换成二进制=64+32+2=01100010
集合中每一个元素都是对应一个二进制位,被选中为1,没有则为0:最后将二进制次序反过来
-- 创建集合表
create table my_set(
hobby set('篮球','足球','乒乓球','羽毛球','排球','台球','网球','棒球')
-- 足球 台球 网球
-- 集合中:每一个元素都是对应一个二进制位,被选中为1.没有则为0;最后反过来
0 1 0 0 0 1 1 0
-- 反过来 01100010与98转换成为的二进制对应
)charset utf8;

mysql数据库--mysql的数据类型(时间日期类型+字符串类型)

集合原理:

-- 插入数据
insert into my_set values(255); -- 255对应二进制8个1,0-255即256个数字,所以查看的时候应该是全部

-- 查看集合数据
select hobby +0 ,hobby from my_set;

mysql数据库--mysql的数据类型(时间日期类型+字符串类型)

集合中元素的顺序没有关系,最终系统都会匹配数据。

-- 颠倒元素出现的顺序
insert into my_set values('网球,台球,足球');

集合的强大在于能够规范数据和节省空间;PHP也可以规范数据,但是对于PHP来说效率优先,而且数据的维护可以通过数字
进行,增加PHP的维护成本;PHP根本没办法判断数据在数据库的形式。很少使用集合的方式