Mysql学习 02

回顾:

数据库的基础知识: 关系型数据库(磁盘) 和 非关系型数据库(内存).
关系型数据库: 建立在关系模型上的数据库
关系模型:
1> 数据结构: 二维表(比较浪费空间)
2> 操作数据的指令集合: SQL(DDL, DML[DQL], 和 DCL).
3> 完整性约束: 表内和表之间(实体)的约束.

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

Mysql 服务端对象: DBMS –>Database –> Table –>fields(字段)

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

字符集问题: 中文数据问题.
1> 改变服务器接收数据的字符集: character_set_client
2> 改变服务器返回数据的字符集: character_set_results
3> 快捷方式: set names 字符集(三件事情).

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

校对集问题: 比较规则: _bin, _cs 和 _ci 利用了排序 (order by)来实现

算法: 快速排序.(递归),
Default-character-set = latin1 – latin1 一个字符对应一个字节.

SQL中数据类型 (列类).

所谓的数据类型: 对数据进行统一的分类, 从系统的角度出发是为了能够使用统一的方式进行管理: 更好的利用有限的空间.

SQL 中将数据类型分成了三大类: 数值类型, 字符串类型日期时间类型.
这里写图片描述

数值型:

数值型数据: 都是数值类型
系统将数值型分为 整数型小数型.

整数型:

存放整型数据: 在SQL中因为要更多的考虑如何节省磁盘空间,所以系统将整型又细分成了 5类:

Tinyint: 迷你整型, 使用一个字节存储,表示的状态最多为 256 种 (常用)
Smallint: 小整型,使用 2 个字节存储, 表示的状态最多为 65536种
Mediumint: 中整型, 使用 3 个字节存储
Int: 标准整型, 使用 4 个字节存储 (常用)
Bigint: 大整型, 使用 8 个字节存储.
这里写图片描述

创建一张整型表;
这里写图片描述

插入数据: 只能插入整型, 只能插入范围内的整型数据.

这里写图片描述

SQL中数值类型全部都是默认有符号: 有正负号.
有时候需要使用无符号数据,需要给数据类型限定: int unsigned; 表示无符号; 从0 开始.
这里写图片描述

数据的插入:
这里写图片描述

查看表结构的时候,发现每个字段的数据类型之后都会自带一个括号,里面有指定的数字
这里写图片描述

显示宽度: 没有特别的含义,只是默认的告诉用户可以显示的形式而已: 实际上用户是可以控制的,这种控制不会改变数据本身的大小.
这里写图片描述

**显示宽度的意义: 在于当数据不够显示宽度的时候,会自动让数据变成对应的显示宽度.通常需要搭配一个前导 0 来增加宽度, 不改变值大小: zerofill (零填充):
零填充会导致数值自动变成无符号.**
这里写图片描述

零填充 + 显示宽度的效果:
这里写图片描述

零填充的意义(显示宽度): 保证数据格式.

小数型

小数型: 带有小数点,或者范围超出整数型的数值类型.
SQL中:将小数型又分为两种: 浮点型定点型

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

1. 浮点型
浮点型数据是一种精度型数据:因为超出指定范围之后会丢失精度,(自动的四舍五入).
浮点型: 理论分为两种精度
Float: 单精度,占用 4 个字节存储数据,精度范围大概为 7 位左右.
Double: 双精度占用 8 个字节存储数据,精度范围大概为 15 为左右.
这里写图片描述

创建浮点数表: 浮点的使用方式: 直接float 表示没有小数部分; float(M,D): M 代表总长度, D代表小数部分长度, 整数部分长度为 M – D.
这里写图片描述

插入数据: 可以是直接小数,也可以是科学计数法.
这里写图片描述

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

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

2. 定点型
定点型: 绝对的保证整数部分不会被四舍五入(不会丢失精度), 小数部分有可能 (理论小数部分也不会丢失精度)
这里写图片描述

创建定点数表,以浮点数作为对比;
这里写图片描述

插入数据: 定点数的整数部分一定不能超出长度.(进位也不可以),小数部分的长度可以随意超出(系统自动四舍五入).
这里写图片描述

浮点数如果进位导致长度溢出没有问题, 但是定点数不行.
这里写图片描述

查看数据效果:
这里写图片描述

时间日期类型:

Datetime: 时间日期, 格式是 YYYY-mm-dd HH:ii:ss, 表示的范围是从1000 到 9999年, 有 0 值: 0000-00-00 00:00:00

Date: 日期,就是datatime 中的date部分

Time: 时间(段), 指定的某个区间之间, -负时间到 + 正时间

Timestamp: 时间戳, 并不是时间戳,知识从1970年开始的 YYYY-mm-dd HH:ii:ss 格式与datetime完全一致.

Year: 年份, 两种形式, year(2) 和 year(4):
这里写图片描述

创建时间日期表:
这里写图片描述

插入数据: 时间 time 可以是负数, 而且可以是很大的负数, year 可以使用 2位数 插入,也可以使用 4 位数插入.
这里写图片描述

Timestamp字段: 只要当前所在的记录被更新, 该字段一定自动更新成当前时间.
这里写图片描述

字符串类型

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

定长字符串:

定长字符串: char, 磁盘(二维表)在定义结构的时候,就已经确定了最终数据的存储长度,

Char(L): L 代表length, 可以存储的长度, 单位为字符, 最大长度值可以为255
Char(4): 在UTF8 环境下,需要 4*3 = 12 个字节.

变长字符串

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

Varchar(L): L 表示长度 理论长度是65536 个字符,但是会多出 1 到 2 个字节来无额定存储的实际长度: 但是实际上如果长度超过255, 既不用定长也不用变长, 使用字符串text来存储.
Varchar(10): 的确存了 10 个汉字, utf8 环境下, 10*3+1 = 31 (bytes)
存储了 3 个汉字: 393+1 = 10 (bytes)
这里写图片描述

如何选择定长或者是变长字符串呢?
定长的磁盘空间比较浪费, 但是效率高; 如果数据基本上确定长度都一样,就使用定长.
如: 身份证, 电话号码, 手机号码等.

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

文本字符串

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

枚举字符串:

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

枚举的使用方式
定义: enum (可能出现的元素列表); //如 enum (‘男’,’女’,’不男不女’,’妖’,’保密’);
使用: 存储数据只能存储上面定义好的数据:

创建枚举表:
这里写图片描述

加入数据: 作用之一: 规范数据格式: 数据只能是规定的数据之中的一个.
这里写图片描述

作用之二: 节省存储空间 ( 枚举通常有一个别名: 单选框 ): 枚举实际存储的是数值,而不是字符串本身.
在 mysql中, 系统也是自动转换数据格式的: (尤其是字符串转数字).

证明字段存储的数据是数值: 将数据取出来 + 0 就可以判断出原来的数据存储的到底是字符串还是数值: 如果是字符串最终结果永远为 0, 否则就是其他值.
这里写图片描述

找出了枚举元素的实际规律: 按照元素出现的顺序, 从 1 开始.编号.
这里写图片描述

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

因为枚举实际存储的是数值,.所以可以直接插入数值.
这里写图片描述

集合字符串

集合跟枚举很类似: 实际存储的是数值, 而不是字符串 (集合是多选).

集合使用方式:
定义: Set (元素列表)
使用: 可以使用元素列表中的元素 (多个). 使用逗号分隔.
这里写图片描述
创建集合表:
这里写图片描述

插入数据: 可以使用多个元素字符串组合, 也可以直接插入数值
这里写图片描述
查看数据: 数值 + 数据查看.
这里写图片描述
集合中每一个元素都是对应一个对应二进制位
这里写图片描述
集合中元素的顺序没有关系: 最终系统都会去匹配顺序.
这里写图片描述
集合的强大在于能够规范数据和节省空间.

Mysql记录长度

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

Varchar 的实际存储长度能达到多少呢? 看字符集编码.

Utf8下 varchar 的实际顶配: 21844字符
Gbk下 varchar 的实际顶配 32766字符
这里写图片描述
想用完整个 65535 个字节长度: 增加一个 tinyint 字段即可.
这里写图片描述
这里写图片描述

Mysql中 text 文本字符串,不占用记录长度: 额外存储, 但是 text文本字符串也是属于记录的一部分: 一定需要占据记录中的部分长度: 10个字节. (保存数据的地址以及长度)
这里写图片描述

列属性

列属性: 真正约束字段的是数据类型, 但是数据类型的约束很单一, 需要有一些额外的约束,来更加保证数据的合法性.

列属性: 有很多: NULL/ NOT NULL, default, primary key, unique key, auto_increment, comment.

空属性:

两个值: NULL(默认的)NOT NULL(不为空).

虽然默认的, 数据库基本都是字段为空,但是实际上在真实开发中,尽可能的保证所有的数据都不应该为空: 空数据是没有意义的; 空数据没法参与运算.
这里写图片描述

创建一个实际案例表: 班级表 (名字, 教室)
这里写图片描述

列描述:

列描述: comment 描述, 没有实际含义: 是专门用来描述字段,会根据表创建语句保存: 用来给程序员 (数据库管理员) 来进行了解的.
这里写图片描述

默认值

默认值: 某一种数据会经常性的出先某个具体的值, 可以在一开始就指定好: 在需要真实数据的时候,用户可以选择性的使用默认值.

默认值的关键字: default.
这里写图片描述

默认值得生效: 使用, 在数据进行插入的时候给该字段赋值.
这里写图片描述

想要使用默认值, 可以不一定去指定列表,故意不使用字段列表: 可以使用 default 关键字代替值.

猜你喜欢

转载自blog.csdn.net/yangyang_A/article/details/80320774