MySQL(数据库的基本类型一)
今日内容概要
- 字符编码与配置文件
- 数据库存储引擎
- 创建表的完整语法
- MySQL字段基本数据类型
🐳字符编码与配置文件
在配置文件中,我们可以设置MySQL的各种配置,例如字符集,端口号,目录地址、、、配置的很多,但可以按照功能来进行区域划分,主要分为三大块:
- client:第三方客户端配置信息,配置的是图形界面设置。
- mysql:客户端配置信息,配置的是命令行、客户端的设置。
- mysqld:数据库配置信息,配置的是服务端的一些信息
配置文件的操作:
1.\s查看MySQL相关信息
当前的用户。版本。编码、端口号
MySQL5.6及之前的版本编码是需要人文统一的,但之后的版本已经全部默认统一了。
想要永久的修改编码配置,需要操作配置文件
2.默认的配置文件名是 my-default.ini
拷贝上述文件并重命名为my.ini
直接拷贝字符编码相关配置即可(以下的代码)
[mysqld]
character-set-serever=utf8mb4
collation-server=utf8mb4_general_ci
[client]
default-character-set=utf8mb4
[mysql]
deffault-character-set=utf8mb4
我们也可以将我们的登录账号和密码也直接写在配置文件中,之后使用的时候直接mysql登录即可
[mysql]
user ='root'
password =123
小知识点:
1.utf8mb4能够存储一些表情,功能更多
2.utf8与邨-8是有一定的区别的,MySQL中只有utf8

🐳数据库存储引擎
存储引擎:存取数据,为存储的数据建立索引,更新。查询数据。
因为在关系型数据库中数据是以表的形式存储,所以存储引擎也称为表类型。
查看常见的存储引擎的方式:
show engines;或者show variablkes like 'have%';
需要了解的四个存储引擎:
MyISAM 、InnoDB、Memory 、BlackHole
MyISAM:
-
MySQL 5.5 之前默认存储引擎。
-
基于传统的ISAM类型
-
具有检查和修复表格的大多数工具
-
MySQL表格可以被压缩,而且还支持全文索引
-
不是事务安全
如果是事务回滚造成不完全回滚,不惧有原子性 -
不支持外键
-
存取数据的速度快、安全性较低
ISAM:有索引的顺序访问方法,是存储记录和文件的标准方法
适用场景:不需要税务支持、并发相较低、数据修改相较少、以读为主、数据一致性要求不是特别高。
InnoDB:
-
MYSQL 5.5 之后默认的存储引擎
-
支持事物、行锁、外键等操作
-
存取速度相较MyISAM慢一点,但是安全性更高了
-
InnoDB存储引擎的表支持全文索引,大幅提升了InnoDB存储引擎的文本检索能力。
-
InnoDB表空间分为共享表空间、独享表空间。
适用场景:需要事务支持、行级锁定对高并发有很好地适应能力,但需要确保查询是通过索引完成、数据更新较为频繁。
Memory
-
将表中的数据存放在内存中,如果数据库重启或发生崩溃,表中的数据都将消失。
-
适用于存储临时数据的临时表,以及数据仓库中的纬度表。
MySQL数据库使用MEMORY存储引擎作为临时表来存放查询结果集。 -
默认使用哈希索引,而不是通常熟悉的 B+ 树索引。
-
只支持表锁,并发性能较差。
-
不支持text和blob列类型。
-
会浪费内存,比如:存储变长字段(varchar)时是按照定长字段(char)的方式进行(基于内存存取数据,仅用于历史表数据存取)
BLACKHOLE
黑洞存储引擎,可以应用于主备复制中的分发主库;任何写入进去的数据都会立刻丢失
了解不同存储引擎地层 文件的个数:
innodb
create database db2;
use db2;
ceate table t1(id int) engine=innodb;
.frm 表结构
.ibd 表数据(表索引)
myisam
create table t2(id int) engine=myisam;
.frm 表结构
.MYD 表数据
.MYI 表索引
memory
create table t3(id int) engine=memory;
.frm 表结构
blackhole
create table t4(id int) engine=blackhole;
.frm 表结构
==**ps:MySQL是默认忽略大小写的**==
SQL 语句是不区分大小写,但是字符串内容是区分大小写的(见下面的例句,可以先不用理解什么意思),比如下面这条SQL语句
SELECT * from mysql.USER WHere USER = 'dev';
-- 该SQL语句的 SELECT 、from 、WHere 三个关键字 就是大小写不区分或混着编写的,但是并不影响它的执行与查询结果;
-- 但是 字符串的 'dev' 就需要明确的区分大小写了,因为它是作为一个 '值' 传入到数据库进行数据比对结果查询的。
🐳创建表的完整语法
create table 表名(
字段名 字段类型(数字) 约束条件,
字段名 字段类型(数字) 约束条件,
字段名 字段类型(数字) 约束条件
);
1.字段名和字段类型是必须的
2.数字和约束条件是可选的
3.约束条件也可以写多个 空格隔开即可
4.SQL 语句中的空白和换行是没有限制的,但是不能破话语句的语法结构
5.SQL 语句必须以英文的分号结尾, ";"
"约束" 是对该列的一个条件约束,比如说某字段为 "姓名" 一栏,"约束" 姓名字段不能为空
ps:编写SQL语句报错之后不要慌 仔细查看提示 会很快解决
eg;near ')' at line 7
🐳MySQL字段基本数据类型
🐬字段类型之数值类型
tinyint 1bytes 正负号(占1bit)
smallint 2bytes 正负号(占1bit)
int 4bytes 正负号(占1bit)
bigint 8bytes 正负号(占1bit)
验证整型是否携带正负号
create table t1 (id tinyint);
insert into t1 values(-129),(128);
结果:是-128和127 #也就意味着是默认自带正负号
取消正负号
create table t6(id tinyint unsigned);
insert into t6 values(-129),(128),(1000);


说明:
- 在MySQL中,数值类型都可以指定是有符号的还是无符号的,默认是有符号的。可以在数值类型后面加unsigned来说明某个字段是无符号的。
- 不要因为范围的原因而使用unsigned。比如对于int类型可能存放不下的数据,int unsigned同样可能存放不下,与其如此,还不如设计时,将int类型提升为bigint类型。
- MySQL对于数据的存储,本身具有很严格的约束。说准确点,MySQL数据类型本身就是一种约束。
🐬字段类型之浮点型
语法:
float(m, d) [unsigned]: M指定显示长度,d指定小数位数,占用空间4个字节空间。
float(20,10)
总共存储20位数 小数点后面占10
double(20,10)
总共存储20位数 小数点后面占10
decimal(20,10)
总共存储20位数 小数点后面占10
create table t7(id float(60,20));
create table t8(id double(60,20));
create table t9(id decimal(60,20));
insert into t7 values(1.11111111111111111111);
insert into t8 values(1.11111111111111111111);
insert into t9 values(1.11111111111111111111);
三者的核心区别在于精确度不同
float < double < decimal
🐬字段类型之字符类型
char (固定长度字符串)
语法:
char(len): 固定长度字符串,len表示可以存储的字符长度,最大值可为255
char(4) 意思是最多存储四个字符超出就报错,不够四个就用空格填充至四个
ps;默认情况下,MySQL针对char的存储会自动填充和删除空格
varchar(可变长度字符串)
语法:
varchar(len):可变长度字符串,len表示最大允许存储的字符长度,规定最大允许存储65535个字节大小的字符,具体最大字符个数由字符集种类决定。
varchar(4) 最多存储四个字符,超出就报错,不够的话有几位就存几位
create table 表名1 (id int, name char(4));
craete table 表名2 (id int,name varchar(4));
insert into 表名1 values(1,'Andy');
insert into 表名2 values(1,'andy');
PS:我们想要查看到字段的存储的具体长度,可以使用:
char_length()

PS:需要注意的是,如果 MySQL 字符串类型保存的字符如果太多的情况下,是会影响 MySQL 的读写速度的,一般情况下使用 VARCHAR 这个类型就足够了;如果保存的字符串内容是超长的,一般会选择 NoSQL 数据库来进行保存。 NoSQL 的读写速度要比 MySQL 的超长字符串的读写速度要快很多。后续我们做案例的时候,会将几种数据库结合在一起使用。

两者之间的优劣:
char
优势:整存整取,速度快
劣势:浪费存储空间
varchar
优势:节省存储空间
劣势:存取数据的速度相较char慢
总结:
char和varchar的使用场景还需结合具体的应用场景具体使用
🐬如何选择定长或变长字符串?
🐬如果字段确定好了固定的长度,就使用定长(char),比如:身份证号,手机号等。
🐬如果字段的长度有变化,就使用变长(varchar),比如:名字,地址等。但是你要保证最长的能存的进去。
🐬定长字符串的磁盘空间比较浪费,但是读取效率高。因为它直接读取len字符长度大小的内存空间就行。
🐬变长的磁盘空间比较节省,但是效率低。因为读取之前要事先确定目前存储了多少有效字符。
🐬定长的意义是,直接开辟好对应的内存空间。
🐬变长的意义是,在不超过自定义长度len的情况下,实际用多少字符,就开辟多少空间。
🐳数字的含义
数字在很多的地方都是用来表示限制存储数据的长度,但是在整型中数字却不是用来限制存储长度的。
create table 表名 (id int(3)); 不是控制展示的长度
insert into 表名 values(123456);
create table 表名 (id int(5) zerofill);控制展示长度
insert into 表名 values(123),(123456789);
create table 表名(id int);
ps: 所以右后在写整型的时候无需添加数字

🐠: 平时没有在定义整数的时候没有特殊指定的情况下,一般都是默认使用 int 类型。
🐠:单精度浮点数与双精度浮点数在表示数字的时候并不是很精确,是有误差的。在保存精度不是很高的情况下,可以使用 float、double。
🐠:在对浮点数精度要求非常高的情况下,比如涉及到金额的时候,就需要使用到 "decimal" 了,该数据类型表示的是 "精确的数字类型"
🐠:float和double在不指定精度时,默认会按照实际的精度(由计算机硬件和操作系统决定),decimal如果不指定精度,默认为(10,0);
🐠:浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的范围;缺点是会引起精度问题。

最后再强调一下:在 MySQL 中,定点数以字符串形式存储,在对精度要求比较高的时候(如货币、科学数据),使用 decimal的类型比较好;另外两个浮点数进行减法和比较运算时也容易出问题,所以在使用浮点数时需要注意,并尽量避免做浮点数比较。
🐳严格模式
当我们在使用数据库存储的时候,如果数据不合规范,应该直接报错而不是擅自修改数据,这样会导致数据的失真(没有实际意义)
而且正常的情况下,都是应该报错的,但是上面我们将数据的配置文件进行了修改。
找出所有带mode的文件
show varlables like '%mode%';
重新修改配置文件
1.临时修改
在当前客户端内有效
set session sql_mode = 'strict_trans_tables';
在当前服务端有效
set global sql_mode='strict_trans_tables';
2.永久修改
将下面的代码添加到mysqld配置文件中,然后回到cmd终端,退出服务端,重新启动即可
sql_mode=STRICT_TRANS_TABLES

🐬字段类型之枚举与集合
枚举:
enum:枚举,“单选”类型。该设定提供了若干个选项的值,最终一个单元格中实际只存储了其中一个值。出于效率考虑,这些值实际存储的是“数字”,因为这些选项中每个选项的值依次对应如下数字:1,2,3,…最多65535个,所以我们在添加枚举值时,也可以用数字编号去代替具体的选项值。
枚举语法:enum(‘选项1’, ‘选项2’, ‘选项3’,…);
集合:
set:集合,“多选”类型。该设定提供了若干个选项的值,最终一个单元格中可存储其中任意多个值。出于效率考虑,这些值实际存储的仍是“数字”;最后按顺序每个选项值依次对应到如下数字:1,2,4,8,16,32,… 最多64个。
集合语法:set(‘选项值1’, ‘选项值2’, ‘选项值3’, …);
PS:在向set类型的字段插入数据时,把需要的选项统一写到一个共同的单引号中用逗号隔开,且逗号后面不能有空格。
🐳总结:
- 如果你给出了enum的范围,那在插入时只能多选一,且插入的字段必须在enum中出现。
- 如果你限定了set的范围,那么可以多选多,插入的字段必须在set中出现。
枚举 多选一
create table 表名(
id int,
name varchar(32),
gender enum('male','femle','others')
);
insert into 表名 values(1,'tony','猛男');
结果:报错
insert into 表名 values(2,'jason','male');
结果:添加成功
insert into 表名 values(3,'kevin','others');
结果;添加成功
PS:名字的长度要按照规定写,名字没有按照规定写会报错,选择的属性必须是存在的,要是不存在就会直接报错,
集合 多选多(多选一)
crate table 表名(
id int,
name varcvhar(16),
hobbies set ('read','drawing','sing')
);
insert into 表名 values(1,'write');
结果:报错
insert into 表名 values(2,'read','sing');
结果:添加成功
insert into 表名 values(3,'read','drawing','sing');
结果:添加成功
PS:添加的属性必须是提前规定好,选择的属性不存在就会报错,全选或者选其中的几个都是可以的

🐬字段类型之日期类型
datetime 用于表示 年月日时分秒
date 用于表示 年月日
time 用于表示 时分秒
year 用于表示 年
create table t17(
id int,
name varchar(32),
birthday datetime,
this_year date,
study_tiem time,
work_time year
);
insert into 表名 values(1,'andy','2000-1-1-12:00:00','2022-11-23','12:00:00','2019')
ps:以后涉及到日期相关的字段一般都是系统自动会去处理,无需我们操作


浙公网安备 33010602011771号