MySQL(一)基础知识
[if not exists](#if not exists)
MySQL
MySQL是一个 客户端-服务器结构的 程序,服务器 是真正的 保存和管理数据的 ++本体++ ,是用表来组织数据的 关系型数据库
一、结构
1.客户端
客户端 通过++网络++ 进行++通信++ 向服务器 主动传递数据 主动 发起请求
2.服务器
服务器 永不停机 地 等待着被 接收到请求 处理数据 为客户端返回数据 作响应,一个服务器 为多个客户端 提供服务的
分布式系统
机器处理数据时,一台机器 能即刻应对处理着的数据量 是有限的,当++要及时处理的数据量过多++ 一台机器无法应时处理完时,需要由++多个机器 同时一起分开着 来处理完++ ,就构成了 多个机器下的 分布式系统,机器之间 也成 服务器与客户端关系地 传递处理返回数据,会发生既作服务器 也作客户端的机器 ,也会出现 只为一个机器客户端服务的 服务器机器
二、存储
1.空间
存储空间 分为 内存与 硬盘
1.1内存
1.1.1速度
内存里 操作数据的速度快
1.1.2稳定性
内存里 存储数据的稳定性差 ,++程序重启 或主机断电 存储的数据就丢失了++
1.1.3大小
价格昂贵 买到来用的内存小
1.1.4使用
有的数据库 为了追求速度的最大化 选择了 用内存来存储数据,如redis
1.2硬盘
1.2.1速度
硬盘里 操作数据的速度慢
1.2.2稳定性
硬盘里 存储数据的稳定性高,数据持久地保存
1.2.3大小
价格便宜 买到来用的硬盘大
1.2.4使用
绝大多数数据库 需要 稳定持久地 存储大量数据 ,选择 操作速度慢些的硬盘 来存储
2.体系
表-数据库-服务器
把几个表 放一起集合 就构成了 一个数据库 ,++每个表 都是属于在 它所属的 一个数据库中的++ ,一个服务器 存储管理着 许多数据库
3.特点
3.1唯一性
服务器 都是 不重复唯一性地 高效存储数据库,建库检索时 发现此库已存在有的,会立马终止程序 来阻止建库的发生
if not exists
因为到后面建库时 可能出现 此时要去创建使之存在有的库 ++不确定是否前面已经存在++ 、且++一次要创建的库特别多 也不方便一个个往前去查++ ,直接加if not exists 将它们未存在的创建、已存在的不创建 最后都一定执行成功地 将它们创建得都存在有
3.2轻巧性
一般不会在数据库中 存储很大的数据,如二进制数据的 音乐、图片、视频,很大的数据 单单遍历路过 都要花费很长的时间 ,何况对它 增删查改操作,它的存在 会大大影响到 数据库的增删查改的效率 ,所以都是将很大的数据 存储在专门的目录中,在数据库中 存储它的路径
三、编码
数据在底层都是转化成码的形式 来存储的,参照不同的字符集 将++数据编成的码 就不一样++ ,++码内容 字节量就不一样++:
1.utf8
utf8字符集,没有固定编成的 码的规格大小 ,变长式的编码 ++将世界上所有的语言文字 都有对应的编码++ ,汉字占3个字节,mysql中默认用的是utf8的残本,没有对 复杂的中文字符 与emoji表情编码的部分,在创建库的时候可以指定字符集为完整的utf8:
sql
create database if not exists test1 charset utf8;
2.utf8mb4
后面mysql对其进行补充完整的 utf8mb4字符集则才是utf8的完全体
3.unicode
unicode是 只对字符进行编码的 字符集,对多个字符合并的字符串 没有字符边界意识 将其调整合并编码 ,还是将字符串视为一个字符,判断为不存在 而无法编码,而utf8其实是 unicode补充了对字符串合并编码的 升级版
4.gbk
windows 使用的的是 gbk字符集,汉字占2个字节
四、类型
1.数值类型
1.1整数
n位的二进制数,有符号 下 数值的范围为**-2^(n-1) ~ 2^(n-1) - 1** ,无符号 下 数值的范围为0 ~ 2^(n) - 1
1.1.1BIN[(M)]
BIN[(M)] ,用来存放 M位的二进制数,M范围1~64,存储数值范围0~2^(M)-1,M默认为1,存放一个 0或1 用来表示真假 ,对应Java的Boolean类型
1.1.2TINYINT
TINYINT 1字节的大小,对应Java的Byte类型
1.1.3SMALLINT
SMALLINT 2字节的大小,对应Java的Short类型
1.1.4INT
INT 4字节的大小,对应Java的Integer类型
1.1.5BIGINT
BIGINT 8字节的大小,对应Java的Long类型
1.2浮点数
1.2.1IEE754标准
在IEE754标准下 会丢失精度 存在一定误差,浮点数 去进行++大小的比较++ 是很危险的 :++0.1 + 0.2 != 0.3++
1.2.1.1FOLAT(M,D)
FOLAT(M,D),存放 M个数字位数、D个小数位数的 ++单精度++ 浮点数,4字节的大小,对应Java的Float类型
1.2.1.2DOUBLE
DOUBLE,8字节的大小,对应Java的Double类型
1.2.2准确标准
1.2.2.1DECIMAL(M,D)
DECIMAL(M,D),存放精确数值的 ++双精度++ 浮点数,精度提高,但运算的速度减慢 ,占的空间变大 ,对应Java的BigDecimal类型
1.2.2.2NUMERIC(M,D)
NUMERIC(M,D)是 和DECIMAL一样的类型
2.字符串类型
2.1文本数据
文本数据 存储的是 码表上存在的 字符数据,++一个汉字是一个字符 ,但是可能对应多个字节的大小++
2.1.1VARCHAR(SIZE)
VARCHAR(SIZE) 动态按需 最大开辟SIZE个字符 的空间 去存储,是可变长度的字符串,最大可存储0~65535字节 的空间,对应Java的String类型
2.1.2TEXT
TEXT 存储0~65535字节空间的 长文本 数据,对应Java的String类型
2.1.3MEDIUMTEXT
MEDIUMTEXT 存储0~16777215字节空间的 长文本 数据,对应Java的String类型
2.2二进制数据
对于码表上 查找不到不存在的数据 就是二进制数据
BLOB
BLOB 存储0~65535字节空间的 二进制数据,对于Java的**byte[]**类型
3.日期类型
日期类型 用来存储 1970年1月1日0时0分0秒基准时刻 到当前时刻 的 秒数/毫秒数/微妙数之差 的时间戳
3.1TIMESTAMP
TIMESTAMP的大小为4个字节,现在用来存储秒级时间戳 都快不够了,可以存储1970~2038年的时间戳,对应Java的Java.util.Date 、Java.sql.Timestamp类型
3.2DATETIME
DATETIME的大小为8个字节,可以存储1000~9999年的时间戳,对应Java的Java.util.Date 、Java.sql.Timestamp类型