字符编码与配置文件
在MySQL中 可以使用\s来查看相关信息。当前登录的用户,MySQL的版本,编码与端口号。
想要永久修改编码配置需要操作配置文件。
配置文件在安装目录下的:my_default.ini
拷贝并重命名为 my.ini
===================================================================================
[mysqld]
character-set-server=utf8mb4
collation-server=utf8_general_ci
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES # 严格模式
[client] # 第三方客户端设置
default-character-set=utf8mb4
[mysql] # mysql的客户端
default-character-set=utf8mb4
===================================================================================
修改后需要重启MySQL服务
使用utf8mb4 编码,此编码能把表情完好无损的保存下来,功能强大。
注意: 5.6 之前的版本 才需要手动配置,之后的版本全部默认做了统一。
也可以把用户名与密码放入mysql客户端内,可以在登陆的时候不需要输入用户名密码就可登录
user='root'
password=123
数据库存储引擎
存储引擎 数据库 针对数据采取的多种存取方式
查看常见的存储引擎的代码:
show engines;
常用的四个引擎及其后缀
一、MyISAM
MySQL5.5版本之前的默认存储引擎
存取速度快,功能少,安全性较低
3个文件后缀:
1. .frm # 表结构
2. .MYD # 表数据
3. .MYI # 表索引
二、InnoDB
5.5版本之后默认的存储引擎
支持事物,行锁,外键等操作,存取速度没有MyISAM快,但是安全性更高
2个文件后缀:
1. .frm 表结构
2. .ibd 表数据(表索引)
"""
事物(数据出现问题能回退到出问题之前)
行锁(操作某一行数据时其他人不能操作)
外键(数据与数据之间建立关系)"""
三、Memory # 记忆 it里内存的意思
基于内存存取数据,用于临时表数据存取。
" 关闭程序时数据丢失。"
1个文件后缀:
.frm 表结构
四、BlackHole # 黑洞
任何写入的数据都会立刻丢失
1个文件后缀:
.frm 表结构
代码验证
create database db2; # 建议一个库用于测试
use db2; # 进入库, MySQL 不分大小写
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;
往表内写入数据
insert into t1 values(1); # 1
insert into t2 values(1); # 1
insert into t3 values(1); # 1 因数据还在内存里,重启mysql 后 0
insert into t4 values(1); # 0
创建表的完整语法
create table 表名(
字段名 字段类型(数字) 约束条件,
字段名 字段类型(数字) 约束条件,
字段名 字段类型(数字) 约束条件
)
注意事项:
1. 字段名与字段类型必须填写
2. 数字与约束条件是可选的
3. 约束条件可以写多个,空格隔开
4. 最后一行不能加逗号
数字的含义
数字在很多地方是用来限制存储数据的长度。
整型中数字却不是用来限制存储长度的,是用来控制展示的长度
"建立 整型字段无需输入数字"
代码验证:
create table t1(id int(3));
insert into t1 values(1234);
select * from t1; # 结果是1234 很明显不是限制长度
create table t2(id int(5) zerofill);
# zerofill 可以把不足位数的数字用0填充
insert into t2 values(123),(1234567);
select * from t2;
结果是 00123 , 1234567
严格模式
我们在使用数据库存取数据时,如果数据不符号规范应该直接报错,而不是直接修改数据,这样会导致数据失真.
严格模式就是用来不符合规范直接报错
1.修改配置文件
[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
2. 临时修改
set session sql_mode='strict_trans_tables'; # 在当前客户端有效
set global sql_mode='strict_trans_tables'; # 在当前服务端有效
show variables like '%mode%'; 查看当前mysql配置
字段类型
整型
tinyint 1bytes(字节) 正负号占(1bit)
smallint 2bytes 正负号占
int 4bytes 正负号占
bigint 8bytes 正负号占
整型是携带正负号的
create table t1(id tinyint);
insert into t1(-129),(128);
在取消严格模式下测试:
结果 -128 和127 怎么少了一位呢,被正负号占用了
我们也可以取消正负号
create table t1(id tinyint unsigned);
insert into t1 values(-129),(128),(888);
结果 # 0 128 256

浮点型
1. float(60,20)
2. double(60,20)
3. decimal(60,20)
存储60位数,小数点后20位。
进行测试三者有何不同
create table t1(id float(60,20));
create table t2(id double(60,20));
create table t3(id decimal(60,20));
insert into t1 values(1.11111111111111111111);
+------------------------+
| id |
+------------------------+
| 1.11111116409301760000 |
+------------------------+
insert into t2 values(1.11111111111111111111);
+------------------------+
| id |
+------------------------+
| 1.11111111111111120000 |
+------------------------+
insert into t3 values(1.11111111111111111111);
+------------------------+
| id |
+------------------------+
| 1.11111111111111111111 |
+------------------------+
三者的区别在于 数字的精准度不同
float < double < decimal

字符类型
" char" 定长
char()根据我们在括号内填写的数字最多存储该数字的字符,字符不够则用空格填充。超出报错
优势:整存整取,速度快
劣势:浪费存储空间
====================================================================================
"varchar" 变长
varchar() 根据我们在括号内填写的数字最多存储该数字的字符 ,不够有几个存几个, 超出报错
优势:节省存储空间
劣势: 存去数据的速度较char 慢
varchar 不一样在于存取字符时会在字符前面+上报头。传输的时候先传报头。
====================================================================================
代码验证:
create table t1(id int,name char(4));
create table t2(id int,name varchar(4));
insert into t1 values(1,'t');
insert into t2 values(1,'tank')
" 使用select char_length(name) from 表名;"
查看该字符的长度。
默认情况下MySQL针对char的存储会自动填充空格和删除空格,
使用
set global sql_mode='strict_trans_tables,pad_char_to_full_length';
更改配置查询填充空格后的字符长度
枚举与集合
枚举 "enum" 多选一
create table t1(
id int,
name varchar(32),
gender enum('male','female'))
insert into t1 values(1,'tank','male');
+------+------+--------+
| id | name | gender |
+------+------+--------+
| 1 | tank | male |
+------+------+--------+
insert into t1 values(2,'zyg','sss');
# Data truncated for column 'gender' at row 1 第1行的“性别”列的数据被截断
在我们设定好了多选一的情况下不输入其内部含有的 就会报错
===================================================================================
集合 set 多选多包含多选一
create table t1(
id int,
name varchar(32),
hobbies set('read','Basketball','music'));
insert into t2 values(1,'tank','read,music');
+------+------+------------+
| id | name | hobbies |
+------+------+------------+
| 1 | tank | read,music |
+------+------+------------+
日期类型
datetime 年月日时分秒
date 年月日
time 时分秒
year 年
可以用在 注册时间,生日啊,学习时间啊,工作年限啊。这些需要使用到时间的字段。
create table t17(
id int,
name varchar(32),
register_time datetime,
birthday date,
study_time time,
work_time year
);
insert into t17 values(1,'tank','2022.9.21,14:00:00','1994.11.11','17:10:00','2011');
+------+------+---------------------+------------+------------+-----------+
| id | name | register_time | birthday | study_time | work_time |
+------+------+---------------------+------------+------------+-----------+
| 1 | tank | 2022-09-21 14:00:00 | 1994-11-11 | 17:10:00 | 2011 |
+------+------+---------------------+------------+------------+-----------+
注意: 要按照时间格式来填写 年月日. 时分秒:
涉及到日期相关字段一般都是系统自动回去 无需我们自己操作
