Mysql基础:字符编码与配置文件、数据库存储引擎、创建表的完整语法、MySQL字段基本数据类型、MySQL字段常见约束条件
一、字符编码与配置文件
昨天我们讲解到MySQL文件夹内的my-default.ini文件是配置文件,这里我们讲一些简单的配置设置。
ps:修改配置文件后需要重新启动MySQL服务才能生效。
mysql配置文件的作用
1.影响服务端的启动(mysqld)
2.影响客户端的连接
1.\s——查看MySQL相关信息
登陆MySQL后使用\s命令后就可以查看当前用户、版本、编码、端口号。
MySQL5.6及之前的版本编码需要人为统一 之后的版本已经全部默认统一。如果想要永久修改编码配置,需要操作配置文件。
2.配置文件修改默认字符编码类型
默认的配置文件是my-default.ini
但是我们在使用的时候不建议直接修改默认的配置文件,理想的操作应该是拷贝上述文件并重命名为my.ini,然后再my.ini中修改配置。
配置文件打开后分成两部分内容,一部分是注释,一部分是配置代码。注释部分在每一行的开头有井号(#)。
ps:配置文件中的注释可以有中文,但是配置代码中不能出现中文。
配置代码
直接拷贝字符编码相关配置即可无需记忆
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
ps:
1.utf8mb4能够存储表情 功能更强大
2.utf8与utf-8是有区别的 MySQL中只有utf8
修改了配置文件中关于[mysqld]的配置 需要重启服务端
3.利用配置文件免输入账号信息登陆
将管理员登录的账号密码直接写在配置文件中,之后使用mysql登录即可。
代码如下:
[mysql]
user='root'
password=123
二、数据库存储引擎
1、存储引擎
数据库针对数据采取的多种存取方式。存储引擎是数据库底层软件组件,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据库操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能。使用不同的存储引擎,还可以获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySQL的核心就是存储引擎。
2、查看存储引擎的语句
show engines;
3、需要了解的四个存储引擎
1.MyISAM
MySQL5.5(包括5.5版本)之前默认使用的的存储引擎。
存取数据的速度快,但是功能较少,安全性较低。
2.InnoDB
MySQL5.5之后默认使用的的存储引擎。
支持事务、行锁、外键等操作,虽然存取速度没有MyISAM快,但是安全性更高。
3.Memory
基于内存存取数据,仅用于临时表数据存取。
4.BlackHole
任何写入进去的数据都会立刻丢失。
4、了解不同存储引擎底层文件个数
用各个存储引擎创建不同的表,然后去查看文件个数(如果不是5.6版本可能文件个数会不一样)。
create database db2;
use db2;
create table t1(id int) engine=innodb;
create table t2(id int) engine=myisam;
create table t3(id int) engine=memory;
create table t4(id int) engine=blackhole;
1.innodb有两个文件
.frm 表结构
.ibd 表数据(表索引也放一起了)
2.myisam有三个文件
.frm 表结构
.MYD 表数据
.MYI 表索引
3.memory只有一个文件
.frm 表结构
4.blackhole只有一个文件
.frm 表结构
创建了表之后我们加入数据
insert into t1 values(1);
insert into t2 values(1);
insert into t3 values(1);
insert into t4 values(1);
ps:MySQL默认忽略大小写
三、创建表的完整语法
语法
create table 表名(
字段名 字段类型(数字) 约束条件,
字段名 字段类型(数字) 约束条件,
字段名 字段类型(数字) 约束条件
);
1.字段名和字段类型是必须的
2.数字和约束条件是可选的
3.约束条件也可以写多个 空格隔开即可
4.最后一行结尾不能加逗号
常见约束
not null 非空
default 默认值
auto_increment 自增长
primary key 主键 非空且唯一
ps:编写SQL语句报错之后不要慌,仔细查看提示,他会告知语句的什么位置疑似有错误,通过提示可以很快解决问题。
四、字段类型之整型
概念
整型主要用于存储整数值,主要有以下几个字段类型:
这里的范围是根据字节大小计算得到的(一个字节等于八位二进制)。
整型经常被用到,比如 tinyint、smallint、int、bigint 。默认是有符号的,符号会占用一个字节(bytes),若只需存储无符号值,可增加 unsigned 属性。
int(M)中的 M 代表最大显示宽度,并不是说 int(1) 就不能存储数值10了,不管设定了显示宽度是多少个字符,int 都是占用4个字节,即int(5)和int(10)可存储的范围一样。
存储字节越小,占用空间越小。所以本着最小化存储的原则,我们要尽量选择合适的整型,例如:存储一些状态值或人的年龄可以用 tinyint ;主键列,无负数,建议使用 int unsigned 或者 bigint unsigned,预估字段数字取值会超过 42 亿,使用 bigint 类型。
验证整型默认是否携带正负号
需要先在配置文件中删除下列信息:
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
不删除的情况下就属于严格模式。
输入下列代码创建表(用上tinyint字段类型)并添加数据值
create table t5(id tinyint);
insert into t5 values(-129),(128);
结果是-128和127,也就意味着默认情况下是自带正负号的。
我们也可以用unsigned取消正负号
create table t6(id tinyint unsigned);
insert into t6 values(-129),(128),(1000);
取消正负号后最小就是0,最大255.
五、严格模式
当我们在使用数据库存储数据的时候,如果数据不符合规范,应该直接报错而不是擅自修改数据,这样会导致数据的失真(没有实际意义)。
在测试整形字段是否自带正负号的时候,就出现了失真的情况。正常都应该报错。但是我们之前不小心改了配置文件。
使用下方代码可以查看是否启动了严格模式:
show variables like '%mode%';
1.临时修改
set session sql_mode='strict_trans_tables';
在当前客户端有效
set global sql_mode='strict_trans_tables';
在当前服务端有效
2.永久修改
直接修改配置文件在mysqld下方加上如下代码:
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
六、字段类型之浮点型
概念
浮点型主要有 float,double 两个,浮点型在数据库中存放的是近似值,例如float(6,3),如果插入一个数123.45678,实际数据库里存的是123.457。
语法简介
float(20,10)
总共存储20位数,小数点后面占10位数。
定点型字段类型有 decimal 一个,主要用于存储有精度要求的小数。
对于声明语法 DECIMAL(M,D) ,自变量的值范围如下:
M是最大位数(精度),范围是1到65。可不指定,默认值是10。
D是小数点右边的位数(小数位)。范围是0到30,并且不能大于M,可不指定,默认值是0。
例如字段 salary DECIMAL(5,2),能够存储具有五位数字和两位小数的任何值,因此可以存储在salary列中的值的范围是从-999.99到999.99。
代码验证精确度
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精确度最高。
三者的核心区别在于精确度不同
float < double < decimal
七、字段类型之字符类型
概念
字符串类型也经常用到,常用的几个类型如下表:
其中 char 和 varchar 是最常用到的。char 类型是定长的,MySQL 总是根据定义的字符串长度分配足够的空间。当保存 char 值时,在它们的右边填充空格以达到指定的长度,当检索到 char 值时,尾部的空格被删除掉。varchar 类型用于存储可变长字符串(即变长),存储时,如果字符没有达到定义的位数,也不会在后面补空格。
char(M) 与 varchar(M) 中的的 M 表示保存的最大字符数,单个字母、数字、中文等都是占用一个字符。char 适合存储很短的字符串,或者所有值都接近同一个长度。例如,char 非常适合存储密码的 MD5 值,因为这是一个定长的值。对于字符串很长或者所要存储的字符串长短不一的情况,varchar 更加合适。
我们在定义字段最大长度时应该按需分配,提前做好预估,能使用 varchar 类型就尽量不使用 text 类型。除非有存储长文本数据需求时,再考虑使用 text 类型。
代码查看char和varchar的实际情况
create table t10(id int, name char(4));
create table t11(id int, name varchar(4));
insert into t10 values(1, 'jason1');
insert into t11 values(1, 'jason2');
ps:char_length()获取字段存储的数据长度
默认情况下MySQL针对char的存储会自动填充空格和删除空格
因此我们需要使用set global进行设置,在设置的时候需要把之前设置的指令也写上,否则会之前的指令就不生效了。
set global sql_mode='strict_trans_tables,pad_char_to_full_length';
接着使用
select char_length(name) from t10;
select char_length(name) from t11;
就能看到字符的长度变成了4和1
char和varchar对比
char
优势:整存整取 速度快
劣势:浪费存储空间
varchar
优势:节省存储空间
劣势:存取数据的速度较char慢
比如在存储下方的字符时,char字段类型使用空格填充,varchar就需要使用报头,记录每一次记录的字符的长度,而报头需要占用一个字节
jacktonyjasonkevintomjerry
1bytes+jack1bytes+tony1bytes+jason1bytes+kevin1bytes+tom1bytes+jerry
八、数字的含义
- 数字在很多地方都是用来表示限制存储数据的长度,但是在整型中数字却不是用来限制存储长度,是用来设置展示长度的(即打印长度),默认情况下(也就是括号内不写数字)int括号内的参数是11。
create table t12(id int(3)); 不是用来限制长度
insert into t12 values(12345);
![image](https://img2022.cnblogs.com/blog/2929167/202211/2929167-20221123173923023-1045582161.png)
create table t13(id int(5) zerofill); 而是用来控制展示的长度
insert into t13 values(123),(123456789);
![image](https://img2022.cnblogs.com/blog/2929167/202211/2929167-20221123174000412-986772782.png)
create table t14(id int);
"""以后写整型无需添加数字"""
九、字段类型之枚举(enum)与集合集合(set)
enum枚举是多选一,像python布尔类型,
set集合是多选一或多
枚举
多选一
create table t15(
id int,
name varchar(32),
gender enum('male','female','others')
);
insert into t15 values(1,'tony','猛男');
insert into t15 values(2,'jason','male');
insert into t15 values(3,'kevin','others');
意思就是在给表添加记录的时候,枚举类型的值只能从创建时设定的值中选一个,否则都会报错。
![image](https://img2022.cnblogs.com/blog/2929167/202211/2929167-20221123174117995-1006789125.png)
![image](https://img2022.cnblogs.com/blog/2929167/202211/2929167-20221123174153307-2056470948.png)
集合
多选多(多选一)
create table t16(
id int,
name varchar(16),
hobbies set('basketabll','football','doublecolorball')
);
insert into t16 values(1,'jason','study');
insert into t16 values(2,'tony','doublecolorball');
insert into t16 values(3,'kevin','doublecolorball,football');
集合的选择条件是让我们在给定的数据值中选择一个或多个,如果一个也没有就会报错。
十、字段类型之日期类型
概念
MySQL支持的日期和时间类型有 YEAR 、TIME 、DATE 、DATETIME 、TIMESTAMP,几种类型比较如下:
涉及到日期和时间字段类型选择时,根据存储需求选择合适的类型即可。
datetime 年月日时分秒
date 年月日
time 时分秒
year 年
关于 DATETIME 与 TIMESTAMP 两种类型如何选用,可以按照存储需求来,比如要求存储范围更广,则推荐使用 DATETIME ,如果只是存储当前时间戳,则可以使用 TIMESTAMP 类型。不过值得注意的是,TIMESTAMP 字段数据会随着系统时区而改变但 DATETIME 字段数据不会。总体来说 DATETIME 使用范围更广。
实操代码
create table t17(
id int,
name varchar(32),
register_time datetime,
birthday date,
study_time time,
work_time year
);
insert into t17 values(1,'jason','2000-11-11 11:11:11','1998-01-21','11:11:11','2000');
ps:以后涉及到日期相关字段一般都是系统自动获取 无需我们可以操作