数据基本数据类型
内容概要
- 字符编码与配置文件
- 数据库存储引擎
- 创建表的完整语法
- MySQL字段基本数据类型
- MySQL字段常见约束条件
字符编码与配置文件
-
\s查看MySQL相关信息当前用户、版本、编码、端口号
MySQL5.6及之前的版本年吗需要人为统一 之后的版本已经全部默认

编码不一致
我们需要修改配置文件

打开
my-default.ini后
复制后重命名为
my.ini
修改为

在运行MySQL

"""my.ini""" [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 yu utf-8是有区别的 MySQL中只有utf8 修改了配置文件中关于[mysqld]的配置 需要重新启动服务端
数据库引擎
-
存储引擎
数据库针对数据采取多种存取方式
-
查看常见引擎的方式
show engines;

-
需要了解的四个存储引擎
-
MyISAM
MySQL5.5 之前默认的存储引擎
存取数据的速度快 但是功能较少 安全性低
-
InnoDB
MySQL5.5之后默认的存储引擎
支持事务、行锁、外键等操作 存取速度没有MyISAM快 但是安全性更高
-
Memory
基于内存存取数据 仅用于零食表数据存取
-
BlackHole
任何写进去的数据都会立刻消失
-
-
事物
-
思考:我去银行给朋友汇款,我卡上有1000元,朋友卡上500元,我给彭转账50元(无手续费),如果我的钱刚扣,而朋友的钱没有加上时网断了,怎么办
-
事物的ACID特性
-
原子性(Atomocoty):原子意为最小的粒子,或者说不能再分的事物。数据库事务的不可再分的原则即为原子性。
组成事务的所有查询必须:要么全部执行,要么全部取消(就像上面的银行例子)。
-
一致性(Consistency):直属局的规则,在事务前后应保持一致
-
隔离性(Isolation):简单点说,某个事务的操作对其他是事务不可见
-
持久性(Durabilty):当食物提交完成后,其影响应该保留下来,不能撤销
-
-
-
了解不同存储引擎底层文件个数
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)enginr=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);

blackhole 引擎存什么都会没有
memory 引擎是存储到内存 关闭服务在打开服务 也会没有
创建表的完整语法
create table 表名(
字段名 字段类型(数字) 约束条件,
字段名 字段类型(数字) 约束条件,
字段名 字段类型(数字) 约束条件
);
1.字段名和字段类型是必须的
2.数字和约束条件是可选的
3.约束条件也可以写多个 空格隔开即可
4.最后一行结尾不能加逗号
ps:编写SQL语句报错之后不要慌 仔细查看提示会很快解决
字段类型之整型
tinyint 1bytes 正负号(占1bit)
smallint 2bytes 正负号(占1bit)
int 4bytes 正负号(占1bit)
bigint 8bytes 正负号(占1bit)
验证整型默认是否携带正负号
create table t5(id tinyint);
inset into t5 values(-129),(128);
提前结果 -128和127 默认带正负号
我们也可以取消正负号
create table t6(id tinyint unsigned);
insert into t6 values(-129),(128),(1000);

我添加的数据是-129和259 但是存的数据失真的但是数据库也没有报错,他应该的报错的但是没有
是因为数据库没有进入严格模式
他是默认严格模式但是我们修改的配置文件,所以没有进入
严格模式
当我们在使用数据库的时候 如果数据不符合规范 应该直接报错而不是擅自修改数据 这样会导致数据失真(没有实际意义)
正常都应该报错 但是我们之前不小心改了配置文件
show variables like '%mode%';

1.临时修改
set session sql_mode = 'strict_trans_tables';
当前客户端有效
set global sql_mode = 'strict_trans_tables';
写完之后要重启一下服务端
2.永久修改
直接修改配置文件


这次写直接报错 达到了我们想要的效果
字段类型之浮点型
float(60,30)
总共存储60位 小数点后面占30
double(60,30)
总共存储60位 小数点后面占30
decimla(60,30)
总共存储60位 小数点后面30位
create table t6(id float(60,30));
create table t7(id double(60,30));
create table t8(id decimla(60,30));

insert into t7 values(1.1111111111111111111);
insert into t8 valuse(1.11111111111111111111);
insert into t9 values(1.11111111111111111111);

三者的核心区别在于精确度不同
float < double < decimal
其实float已经够我们正常使用了 到时候不行用字符串
字段类型之字符类型
char
定长
char(4) 最多存储四个字符 超过就报错 不够四个空格填充至四个
varchar
变长
varchar(4) 最多存储四个字符 超出就报错 不过则有几位存几位
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, 'jsaon2');

insert into t10 values(1, 'J');
insert into t11 values(1,'K');
"""查看字段存储的数据长度"""
select char_length(name) from t10;
select char_length(name) from t11;

怎么回事t10不应该是4个字符怎么是1个字符,因为数据库给你做处理他在硬盘上存储还是4个字符,他取出来的时候直知道他给你加了空格,自己又把空格去掉了所以显示的是一个字符
让他不这么做需要加东西
set global sql_mode='strict_trans_tables,pad_char_to_full_length';
需要重启服务端 如果不行 就在重启一下客户端



char 与 varchar
char
优势:整存整取 速度快
劣势: 浪费内存空间
varchar
优势:节省内存空间
劣势:存取较char慢
因为varchar存数据会先发一个字节的报头告诉这个数据几个字节 读的时候也会先读报头在读数据 所以速度慢
"""
char 与 varchar的使用需要结合具体的应用场景
"""
数字的含义
数字在很多地方是用来表示限制存储数据的长度
但是在整型中数字确不是用来限制存储长度
crearte table t12(id int(3));
insert into =t12 values(12345);
create table t13(id int(5) zerofill);
inser into t13 values(123),(12344554);
create table t14(id int);
desc t14
"""
以后写整型不需要添加数字
"""




"""
默认的都有所以写不写都一样
"""

字段类型之枚举与集合
-
枚举
多选一
create table t15(id int, name varchar(32), gender enum('male','female','others'))charset utf8; insert into t15 values(1,'jason','猛男'); insert into t15 values(2,'tony','male'); insert into t15 values(3,'oscar','female')
-
集合
多选多(多选一)
create table 16(id int, name varchar(32), hobbies set('篮球','足球','桌球'))charset utf8; insert into t15 values(1,'jason','篮球,足球'); insert into t15 values(2, 'oscar','哈哈');
字段类型之日期类型
datatime 年月日时分秒
data 年月日
time 时分秒
year 年
create table t17(id int,
name varchat(32),
register_time datetime,
birthday date,
study_time time,
work_time year);
inset into t17 values(1,'jason','2000-11-11 11:11:11','1998-01-21','11:11:11','2000')


ps:以后涉及到日期相关的字段一般都是系统自动获取。

浙公网安备 33010602011771号