六天玩转Mysql(第二天)

第二天

回顾

数据库基础知识:关系型数据库(磁盘)和非关系型数据库(内存)

关系型数据库:建立在关系模型上的数据库

       数据结构:二维表(比较浪费时间)

       操作数据的指令集合:SQL(DDL、DML[DQL]和DCL)

       完整性约束:表内和表之间(实体)

Mysql关系型数据库:c/s架构软件(连接认证、发送SQL指令、服务器处理指令返回结果、客户端接收结果解析结果)

Mysql服务端对象:DBMS>Database>Table>fields

SQL基本操作:库操作、表操作(字段)和数据操作

字符集问题:中文数据问题

       改变服务器接收数据的字符集:character_set_client

       改变服务器返回数据的字符集:character_set_results

       快捷方式:set name 字符集

web乱码问题:浏览器解析,PHP处理(本地文件),数据库处理

列类型

SQL中将数据类型分为三大类:数据类型,字符串类型和时间日期类型

六天玩转Mysql(第二天)_第1张图片

数值型

tinyint:迷你整型,使用一个字节存储,表示的状态最多为256种

smallint:小整型,使用2个字节存储,表示的状态最多为65536种

mediumint:中整型,使用3个字节存储

int:标准整型,使用4个字节存储

bigint:大整型,使用8个字节存储

 

小数型

SQL中:将小数型细分为两种:浮点型和定点型

浮点型:小数点浮动,精度有限,而且会丢失精度

定点型:小数点固定,精度固定,不会丢失精度

浮点型数是一种精度型数据:因为超过指定范围之后,会丢失精度(自动四舍五入)

浮点型:理论分为两种精度

    float:单精度,占用4个字节存储数据,精度范围大概为7位左右

    double:双精度,占用8个字节存储数据,精度范围大概为15位左右

创建浮点数表:浮点的使用方式:直接float表示没有小数部分;float(M,D):M代表总长度,D代表小数部分长度,整数部分长度为M-D

六天玩转Mysql(第二天)_第2张图片

浮点型数据的插入:整型部分是不能超出长度的,但是小数部分可以超出长度(系统会自动四舍五入)

结果:浮点数一定会进行四舍五入(超出精度范围):浮点数如果是因为系统进位导致整数部分超出指定的长度,那么系统也允许成立。

定点型

绝对的保证整数部分不会被四舍五入(不会丢失精度),小数部分有可能(理论小数部分也不会丢失精度)

时间日期类型

六天玩转Mysql(第二天)_第3张图片

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:年份

六天玩转Mysql(第二天)_第4张图片

字符串类型

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

变长字符串:varchar,在分配空间的时候,按照最大的空间分配,但是实际上最终用了多少,是根据具体的数据来确定。

varchar(L):L表示字符长度,理论长度是65536个字符,但是会多出1到2个字节来确定存储的实际长度。

varchar(10):的确存了10个汉字,utf8环境。10*3+1=31(bytes)

                       存储了3个汉字:3*3+1=10(bytes)

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

定长的磁盘空间比较浪费,但是效率高:如果数据基本上确定长度都一样,就是使用定长,如身份证,电话号码,手机号码等

变长的磁盘空间比较节省,但是效率低:如果数据不能确定长度(不同数据有变化),比如姓名

 

文本字符串

如果数据量非常大,通常说超过255个字符就会使用文本字符串

文本字符串根据存储的数据的格式进行分类:text和blob

Text:存储文字(一般都是存储路径)

Blob:存储二进制数据(通过用的很少)

枚举字符串

enum:事先将所有可能出现的结果都设计好,实际上存储的数据必须是规定好的数据中的一个。

枚举的使用方式

        定义:enum(可能出现的元素列表),比如 enum('男','女','不男不女','妖','保密');

        使用:存储数据,只能存储上面定义好的数据

create table my_enum(
   gender enum('男','女','保密')
)charset utf8;

枚举作用:

1、规范数据格式:数据只能是规定的数据中的其中一个

六天玩转Mysql(第二天)_第5张图片

2、节省存储空间(枚举通常有一个别名:单选框):枚举实际存储的是数值而不是字符串本身。

如何证明枚举存储的数据是数值?

将数据取出来+0,就可以判断出原来的数据存的到底是字符串还是数值,如果是字符串最终结果永远为0,否则就是其他值。

六天玩转Mysql(第二天)_第6张图片

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

集合

create table my_set(
   hobby set('篮球','足球','乒乓球','羽毛球','排球','台球','网球','棒球')
) charset utf8;

Mysql的记录长度

MySQL中规定:任何一条记录最长不能超过65535个字节(varchar永远达不到理论值)

--求出varchar在utf8和GBK下的实际最大值
create table my_utf8(
  name varchar(21844)  --21844*3+2=65532+2=65534
)charset utf8;  

create table my_GBK(
  name varchar(32766)  --32766*2+2=65532+2=65534
)charset GBK;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(数据库)