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

image

🐳数据库存储引擎

存储引擎:存取数据,为存储的数据建立索引,更新。查询数据。

因为在关系型数据库中数据是以表的形式存储,所以存储引擎也称为表类型。

查看常见的存储引擎的方式:

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);

image

image

说明:

  • 在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: 所以右后在写整型的时候无需添加数字

image

🐠: 平时没有在定义整数的时候没有特殊指定的情况下,一般都是默认使用 int 类型。

🐠:单精度浮点数与双精度浮点数在表示数字的时候并不是很精确,是有误差的。在保存精度不是很高的情况下,可以使用 float、double

🐠:在对浮点数精度要求非常高的情况下,比如涉及到金额的时候,就需要使用到 "decimal" 了,该数据类型表示的是 "精确的数字类型"

🐠:floatdouble在不指定精度时,默认会按照实际的精度(由计算机硬件和操作系统决定),decimal如果不指定精度,默认为(10,0);

🐠:浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的范围;缺点是会引起精度问题。
image
最后再强调一下:在 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 

image

🐬字段类型之枚举与集合

枚举:
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:添加的属性必须是提前规定好,选择的属性不存在就会报错,全选或者选其中的几个都是可以的

image

🐬字段类型之日期类型

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:以后涉及到日期相关的字段一般都是系统自动会去处理,无需我们操作

image

posted @ 2022-11-23 19:50  亓官扶苏  阅读(167)  评论(0)    收藏  举报