python四十期--mysql 配置文件修改字符编码,创建不同存储引擎的表方法,创建表的完整语法中字段名所包含的各种字段类型,严格模式,
昨日内容回顾
-
存取数据演变史
1.文本文件 2.目录规范 3.数据库 ps:数据处理统一
-
数据库应用史
1.本地存储 2.网络存储 ps:数据库集群
-
数据库本质
数据库在不同的场景下可能表达的意思不一样 一般情况下指代的是数据库软件 数据库软件的本质其实就是CS架构的应用程序
-
数据库的分类
1.关系型数据库 固定的表结构、数据可以建立数据库层面的关系 MySQL、Oracle、PostgreSQL、MariaDB、sqlite、sql server 2.非关系型数据库 没有固定的表结构、数据无法建立数据库层面的关系 redis、mongoDB、memcache
-
MySQL简介
1.版本问题 2.下载与安装 3.目录介绍
-
MySQL基本使用
1.先启动服务端 2.再启动客户端 ps:启动过程中可能会报错
-
系统服务制作
1.bin目录添加环境变量
2.执行添加系统服务的命令
mysqld --install
3.首次需要人为启动
net start mysql
"""
net stop mysql
mysqld --remove
"""
-
密码相关操作
1.修改密码 mysqladmin -u用户名 -p旧密码 password 新密码 set password=password('新密码') 2.忘记密码 net stop mysql mysqld --skip-grant-table mysql -uroot -p update mysql.user set password=password('新密码') where Hots='localhost' and User='root'; exit net start mysql
-
SQL与NoSQL
SQL语句 统一操作 NoSQL语句 统一操作
-
数据库重要概念
库、表、记录
-
基本SQL语句
1.SQL语句以分号结束
2.数据展示错乱可以在SQL语句结尾加\G
-----------------------------------------
show databases;
create database db1;
show create database db1;
alter database db1 charset='gbk';
drop database db1;
-----------------------------------------
use db1;
show tables;
create table t1(id int);
show create table t1;
desc t1;
describe t1;
alter table t1 rename userinfo;
-----------------------------------------
select * from userinfo;
select id,name from userinfo;
insert into userinfo values(1,'jason');
insert into userinfo values(1,'jason'),(2,'kevin'),(3,'tony'); # 重要!!!
update userinfo set name='jason666' where id=1;
delete from userinfo;
delete from userinfo where id > 3;
.
.
.
.
.
.
今日内容概要
- 字符编码与配置文件
- 数据库存储引擎
- 创建表的完整语法
- MySQL字段基本数据类型
- MySQL字段常见约束条件
补充:windows cmd 窗口中
cls命令是清屏命令,一般是在屏幕窗口中的内容较多的时候使用。
执行该命令后,屏幕上的所有信息都被清除,光标重新定位至屏幕左上角。
.
.
.
.
.
.
今日内容详细
字符编码与配置文件
1.\s查看MySQL相关信息
当前用户、版本、编码、端口号
MySQL5.6及之前的版本编码需要人为统一,之后的版本已经全部默认统一
-------------------------------------------
如果想要永久修改编码配置 需要操作配置文件
2.默认的配置文件是 my-default.ini
拷贝上述文件必须并重命名为 my.ini
-------------------------------------------
直接拷贝字符编码相关配置即可无需记忆
[mysqld] # 表示服务端的配置
character-set-server=utf8mb4 # 服务端将来采用utf8的编码方式
collation-server=utf8mb4_general_ci
[client] # 表示第三方的客户端
default-character-set=utf8mb4 # 客户端将来采用utf8的编码方式
[mysql] # mysql自己的客户端
default-character-set=utf8mb4 # 客户端将来采用utf8的编码方式
补充:
1.utf8mb4能够存储表情 功能更强大
2.utf8与utf-8是有区别的 MySQL中只有utf8
-------------------------------------------
修改了配置文件中关于[mysqld]的配置,需要重启服务端!!!
管理员模式重新打开cmd, net stop mysql 先停止服务端的运行
再启动服务端 net start mysql
再重新登录客户端,就能看成编码被改掉了
---------
修改了配置文件中关于[client]的配置或者[mysql]的配置,就不需要重启服务端
-------------------------------------------
.
mysql 5.6 版本内部默认编码就是混乱的,既有拉丁编码又有gbk编码,会可能产生乱码
.修改配置文件,先停止mysql的系统服务,再启动mysql的系统服务。再登录客户端,\s查看信息时就能看到编码被改掉了!!!就不会出现乱码的情况了!!!
.
在服务端的配置文件里面加一行 print('hello world'),退出服务端,在进入服务端
.
注意在配置文件中[mysql]下面,针对mysql的配置,每一次输入mysql客户端相关的命令时,都会加载配置文件中[mysql]下面的配置,所以一旦加载到不认识的命令时,就会报错!!导致登录不进去了
.
.
.
.
.
利用配置文件我们可以偷懒!!!!!!
将管理员登录的账号密码直接写在配置文件中,这样使用mysql登录就直接变成管理员登录了,而不是游客模式登录了!!!
[mysql]
default-character-set=utf8mb4
user='root'
password=222
.
.
.
.
.
.
数据库存储引擎
补充:MySQL默认忽略英文的大小写,也可以改,但不推荐改!
存储引擎: 数据库针对数据采取的多种存取方式
-----------------------------
查看mysql能够切换的引擎名称 的命令 show engines;
-----------------------------
需要了解的四个存储引擎
MyISAM
MySQL5.5之前默认的存储引擎!!!!!!
存取数据的速度快 但是功能较少 安全性较低!!!!!!
-------------------------------------------
InnoDB
MySQL5.5之后默认的存储引擎!!!!!!
支持事务、行锁、外键等操作 存取速度没有MyISAM快 但是安全性更高!!!
--------------------------------------------
Memory
基于内存存取数据 仅用于临时表数据存取!!!!!!
--------------------------------------------
BlackHole
任何写入进去的数据都会立刻丢失!!!!!!
主要做一些集群备份的时候数据的处理(了解即可)
--------------------------------------------
查看mysql能够切换的引擎名称!!!
.
.
.
.
.
.
了解不同存储引擎底层对应的文件个数
# 文件:是操作系统暴露给用户操作硬盘的快捷方式!!!
create database helloworld;
use helloworld;
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引擎 对应三个文件 由于分工分的更细,所以速度比innodb快点
.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); # 往里面插入任何数据,数据都会丢!!!
.
.
.表t3由于用的引擎是memory,该引擎是基于内存的,所以把服务端关掉内存就清掉了,再重新登录一下,t3里面刚刚插入的数据就没了!!!
.
.
.
.
.
.
.
.
创建表的完整语法
create table 表名(字段名 字段类型(数字) 约束条件);
create table 表名(
字段名 字段类型(数字) 约束条件,
字段名 字段类型(数字) 约束条件,
字段名 字段类型(数字) 约束条件
);
-------------------------------
字段比较多可以换行编写!!!
注意事项:
1.字段名和字段类型是必须的!!!
2.数字和约束条件是可选的!!!
3.约束条件也可以写多个,空格隔开即可!!!
4.最后一行结尾不能加逗号!!!
--------------------------------
ps:编写SQL语句报错之后不要慌 仔细查看提示 会很快解决
一般就看 near后面的提示,提示你哪句话附近有问题!!
.
.
.
.
.
.
.
.
1 字段类型---------整型
下面是4种不同的整型
tinyint 1bytes 正负号(占1bit)
smallint 2bytes 正负号(占1bit)
int 4bytes 正负号(占1bit)
bigint 8bytes 正负号(占1bit)
1个字节8个bit位八个比特位的二进制数据最多能表示到十进制数字255,二的8次方减1
如果涉及到有正负号的数字,正负号占一个bit位,
这样7个比特位的二进制最多只能表示到十进制数字+127
2个字节 那就是二的16次方减一 65535,同理有正负号的情况下,
最多只能表示到二的15次方减一 32767
3个字节 二的24次方减一 16777215,同理有正负号的情况下,
最多只能表示到二的23次方减一 8388607
4个字节 也同理计算!! 4294967295 有正负号情况下最大 2147483647
int 最大只能存10位的数字,要存手机号的话用int就不行了,手机号是11位数字!!
要用bigint了或者只用字符串去存手机号!!!
一些比较长的整形数字,用字符串存可能会更合适一点!!!
------------------------------------------
验证整型默认是否携带正负号
create table t1(id tinyint);
insert into t1 values(-129),(128);
结果是-128和127 因为在有正负号的情况下最小只能到-128 最大只能到127
所以你只要用tinyint 你输的再大再小,只要超范围了,最后存进去的都是127与-128
也就意味着tinyint默认自带正负号!!!牺牲掉一个比特位,
---------------------------------------------------
我们也可以取消正负号 在tinyint后面加unsigned
就表示不要正负号了 unsigned是一个约束条件
create table t2(id tinyint unsigned);
insert into t2 values(-199),(1000);
结果是0和255 还是一样的原理,超过了就存最大值最小值
.
.
.
.
.
.
.
.
思考
作为客户端用户来说,我们是不想看到,往数据库里面存一个数,
如果超过了范围,软件直接用一个该类型的最大值或最小值作为替代往里面存的。
这样存进去的数字又不是用户想要的,没有意义了,还不如直接在存的时候,如果数字超出范围了,
直接报错提醒用户,来的实在!!!
.
.
.
.
.
.
严格模式
当我们在使用数据库存储数据的时候 如果数据不符合规范
应该直接报错而不是擅自修改数据,擅自修改数据会导致数据的失真(没有实际意义)
正常都应该报错 原因是:我们之前不小心改了配置文件!!有一行代码没加!!!
原来默认配置里面最下面有一行代码:
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
-------------------------------------
查看当前使用的数据库的严格模式是什么情况,代码命令为
show variables like '%mode%';
-------------------------------------
我们需要修改一下变成严格模式后,输入超范围的数字就会报错了!!!
strict_trans_tables 严格的转换表
1.临时修改
set session sql_mode='strict_trans_tables';
在当前客户端有效,就是当前窗口不退出来,就一直保持严格模式!!
set global sql_mode='strict_trans_tables';
在当前服务端有效,就是只要服务端不重启,就一直保持严格模式!!
------------------------------------
2.永久修改
直接修改配置文件
把这句话sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
加到my.ini文件里面的[mysqld]下面去就行了
-------------------------------------
insert into t2 values(-199),(1000);
这个时候再插入超范围的数字时,就会直接报错了!!
.
.
.
.
.
.
.
.
.
.
.
2 字段类型-----------浮点型
# 3种不同的浮点型,类型从float---double---decimal 存进去的小数越来越精确!!!
float(20,10)
# 总共存储20位数,小数点后面占10位数 前一个数表示总共要存的位数,后一位表示小数点后面要存的位数
4个字节 # 注意浮点型计算最大数字的方法与整型不一样!!!
-------------------------------------------------
double(20,10) # 总共存储20位数 小数点后面占10
8个字节
------------------------------------------------
decimal(20,10) # 总共存储20位数 小数点后面占10
8个字节
-----------------------------------------------
举例:
create table t3(id float(60,20));
create table t4(id double(60,20));
create table t5(id decimal(60,20));
insert into t3 values(1.11111111111111111111);
insert into t4 values(1.11111111111111111111);
insert into t5 values(1.11111111111111111111);
----------------------------------------------------
三者的核心区别在于精确度不同
float < double < decimal
----------------------------------------------------
正常情况最低的精度float就足够用了!!!!!!
.
.
.
.
.
.
.
3 字段类型---------字符类型
使用频率最高的!!!
char 定长字符
char(4)
最多存储四个字符 超出就报错 不够四个空格填充至四个
也就是说当创建一个表的时候,当指定了字段名与字段类型为char(4),且括号里面写了4,
就是说以后往该字段名下面插入数据时,数据最多就4个字符,数据超出4个字符就报错 ,
不够四个字符,就用空格填充至四个字符!!!
一个空格就是一个字符。
----------------------------------------------------------
varchar 变长字符
varchar(4) 最多存储四个字符 超出就报错 不够则有几位存几位!!!!!!!!
注意:varchar 括号里面的数字尽量写16的倍数
varchar的最大存储字节数是65535,如果我们用的utf8mb3编码格式,1个字符3个字节
3*21844 = 65532
那么括号里写的最大字符数就是21844,为了保险,加满足16的倍数,
# 最大字符数写21760左右就行了!!!
----------------------------------------------------------
create table t6(id int, name char(4));
create table t7(id int, name varchar(4));
insert into t6 values(1, 'jason1'); # 会报错,'jason1'字符长度超4了
insert into t7 values(1, 'jason2'); # 会报错,'jason1'字符长度超4了
insert into t6 values(1, 'tony');
insert into t7 values(1, 'jack');
insert into t6 values(1, 'j');
insert into t7 values(1, 'f');
------------------------------------
验证:t6的char 对应的j后面有3个空格 t7的varchar 对应的f后面没有空格
补充:char_length() 获取字段存储的数据长度
select char_length(name) from t6;
select char_length(name) from t7; # 查看字段存取的数据长度
-------------------------------------
默认情况下MySQL针对char的存储会自动填充空格和删除空格,所以看不出来!!!
mysql的底层针对char(4),假如这个时候存的是一个字符j
当存到硬盘的时候确实是j加3个空格,但是当mysql帮你把数据取出来的时候,
会自动把3个空格给去掉!!所以看到的字符长度还是1
--------------------------------------
set global sql_mode='strict_trans_tables,pad_char_to_full_length';
再退出一下
再进来,再查看字段存取的数据长度,就能看出来了!!!
pad_char_to_full_length
加了这句话后,就取消了底层自动帮你在你数据取出来的时候自动去掉空格的操作!!
--------------------------------------
.
.
char VS varchar 对比
char VS varchar
char
优势:整存整取,速度快
劣势:浪费存储空间
整存整取,char()括号里面写数字几,就按该数字的字符长度整存整取,速度块!!!
----------------------------------
varchar
优势:节省存储空间
劣势:存取数据的速度较char慢 ,因为数据存在硬盘里面是连在一起的,
jacktonyjasonkevintomjerry
因为varchar是变长的,有几位存几位的,所以这个时候就不知道当初是几位几位的存的!!!
所以varchar会将要存的数据前面用1bytes数据作为一个报头,
存数据的时候会计算一下存进去的数据的长度,
然后在该数据前面加一个固定长度的报头,将来在取得时候,先取一个字节长度的报头,
从报头里面解析出后面对应的数据的长度,然后再去拿固定长度的对应数据。如此循环往复!!
这样varchar在存数据的时候会先计算要存的数据的长度的,取数据的时候,
还要用报头解析出真实数据的长度!!!
所以char 肯定比varchar 存取速度块!!!
1bytes+jack1bytes+tony1bytes+jason1bytes+kevin1bytes+tom1bytes+jerry
--------------------------------------
char与varchar的使用需要结合具体应用场景
比如姓名的数据存取,用varchar就比较合适
性别的数据存取,用char就比较合适
有一些字段要经常被查询(比如手机号码),
限制住字段的长度,那么用char比较合适!!!更快!!!
默认情况下MySQL针对char的存储会自动填充空格和删除空格,所以看不出来,
t6的char 对应的j后面有3个空格 t7的varchar 对应的f后面没有空格
.
.
.
.
.
字符类型字段使用参考
其中 char 和 varchar 是最常用到的。
char 类型是定长的,MySQL 总是根据定义的字符串长度分配足够的空间。
当保存 char 值时,在它们的右边填充空格以达到指定的长度,
当检索到 char 值时,尾部的空格被删除掉。
varchar 类型用于存储可变长字符串,存储时,如果字符没有达到定义的位数,也不会在后面补空格。
char(M) 与 varchar(M) 中的的 M 表示保存的最大字符数,
单个字母、数字、中文等都是占用一个字符。
char 适合存储很短的字符串,或者所有值都接近同一个长度。
例如,char 非常适合存储密码的 MD5 值,因为这是一个定长的值。
对于字符串很长或者所要存储的字符串长短不一的情况,varchar 更加合适。
我们在定义字段最大长度时应该按需分配,提前做好预估,
# 能使用 varchar 类型就尽量不使用 text 类型。
除非有存储长文本数据需求时,再考虑使用 text 类型。
-----------------------------------------------
BLOB 类型主要用于存储二进制大对象,例如可以存储图片,音视频等文件。
日常很少用到,有存储二进制字符串时可以考虑使用。
.
.
.
.
.
.
.
.
.
.
数字的含义
写整型括号里无需添加数字!!!
数字在很多地方都是用来表示限制存储数据的长度!!!
# 但是在整型中数字却不是用来限制存储长度!!!
-------------------------------------------
create table t12(id int(3)); # 不是用来限制长度
insert into t12 values(12345); # 可以正常将数据插入到表里面去!!
-------------------------------------------
create table t13(id int(5) zerofill);
# 整型括号里面的数字,是用来控制展示的长度!!!
# zerofill是限制条件
insert into t13 values(123),(123456789);
要存的数据字符数如果小于括号里面的数字比如5,就用0填充至显示的数据位数为5
如果要存的数据字符数已经大于括号里面的数字比如5,该要存的数据有几位展示几位,
但不能超过int能够存储的最大范围!!
.
.
.
.
.
.
.
.
4 字段类型-------------枚举与集合
枚举字段类型 enum() 作用:多选一
gender enum('male','female','others')
# 这样定义后,将来该gender字段能够存的数据就只能是括号里面出现的数据了!!!
--------------------------------------
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');
---------------------------------------------------------
集合字段类型 set() 多选多(也包含多选一)
hobbies set('basketabll','football','doublecolorball')
# 这样定义后,将来hobbies字段能够存的数据,可以是括号里面的一个,
# 也可以是括号里面的多个!!!
# 但是不能是括号里面没出现过的数据!!!!否则会报错!!!
-------------------------------------------------------
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');
.
.
.
.
.
.
.
5 字段类型----------日期类型
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,'jason','2000-11-11 11:11:11','1998-01-21','11:11:11','2000');
补充:以后涉及到日期相关字段,都不需要我们自己去填写数据,一般都是系统自动获取,
无需我们可以操作
.
.
.
.
.
.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY