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编码,会可能产生乱码
image
.修改配置文件,先停止mysql的系统服务,再启动mysql的系统服务。再登录客户端,\s查看信息时就能看到编码被改掉了!!!就不会出现乱码的情况了!!!
image
.
在服务端的配置文件里面加一行 print('hello world'),退出服务端,在进入服务端

.
image

注意在配置文件中[mysql]下面,针对mysql的配置,每一次输入mysql客户端相关的命令时,都会加载配置文件中[mysql]下面的配置,所以一旦加载到不认识的命令时,就会报错!!导致登录不进去了

image
.
.
.
.
.

利用配置文件我们可以偷懒!!!!!!

	将管理员登录的账号密码直接写在配置文件中,这样使用mysql登录就直接变成管理员登录了,而不是游客模式登录了!!!
[mysql]
	default-character-set=utf8mb4
	user='root'
	password=222

image
.
.
.
.
.
.

数据库存储引擎


补充:MySQL默认忽略英文的大小写,也可以改,但不推荐改!

存储引擎:  数据库针对数据采取的多种存取方式
-----------------------------
查看mysql能够切换的引擎名称 的命令     show engines;
-----------------------------
需要了解的四个存储引擎
MyISAM
	MySQL5.5之前默认的存储引擎!!!!!!
	存取数据的速度快 但是功能较少 安全性较低!!!!!!
-------------------------------------------
InnoDB
	MySQL5.5之后默认的存储引擎!!!!!!
	支持事务、行锁、外键等操作 存取速度没有MyISAM快 但是安全性更高!!!
--------------------------------------------
Memory
	基于内存存取数据 仅用于临时表数据存取!!!!!!
--------------------------------------------
BlackHole
	任何写入进去的数据都会立刻丢失!!!!!!
	主要做一些集群备份的时候数据的处理(了解即可)
--------------------------------------------

查看mysql能够切换的引擎名称!!!
image
.
.
.
.
.
.

了解不同存储引擎底层对应的文件个数


# 文件:是操作系统暴露给用户操作硬盘的快捷方式!!!

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);  # 往里面插入任何数据,数据都会丢!!!

image
.
image
.
.表t3由于用的引擎是memory,该引擎是基于内存的,所以把服务端关掉内存就清掉了,再重新登录一下,t3里面刚刚插入的数据就没了!!!
image
.
.
.
.
.
.
.
.

创建表的完整语法

create table 表名(字段名 字段类型(数字) 约束条件);


create table 表名(
	字段名 字段类型(数字) 约束条件,
	字段名 字段类型(数字) 约束条件,
	字段名 字段类型(数字) 约束条件
);

-------------------------------

字段比较多可以换行编写!!!
注意事项:
1.字段名和字段类型是必须的!!!
2.数字和约束条件是可选的!!!
3.约束条件也可以写多个,空格隔开即可!!!
4.最后一行结尾不能加逗号!!!

--------------------------------

ps:编写SQL语句报错之后不要慌 仔细查看提示 会很快解决
	一般就看 near后面的提示,提示你哪句话附近有问题!!

.
.
.
image
.
.
.
.
.

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);
结果是-128127  因为在有正负号的情况下最小只能到-128  最大只能到127
所以你只要用tinyint 你输的再大再小,只要超范围了,最后存进去的都是127与-128
也就意味着tinyint默认自带正负号!!!牺牲掉一个比特位,

---------------------------------------------------

我们也可以取消正负号  在tinyint后面加unsigned
就表示不要正负号了 unsigned是一个约束条件
	create table t2(id tinyint unsigned);
	insert into t2 values(-199),(1000);
结果是0255  还是一样的原理,超过了就存最大值最小值

image
.
image
.
.
.
.
.
.
.

思考


作为客户端用户来说,我们是不想看到,往数据库里面存一个数,
如果超过了范围,软件直接用一个该类型的最大值或最小值作为替代往里面存的。
这样存进去的数字又不是用户想要的,没有意义了,还不如直接在存的时候,如果数字超出范围了,
直接报错提醒用户,来的实在!!!

.
.
.
.
.
.

严格模式


当我们在使用数据库存储数据的时候 如果数据不符合规范
应该直接报错而不是擅自修改数据,擅自修改数据会导致数据的失真(没有实际意义)


	正常都应该报错 原因是:我们之前不小心改了配置文件!!有一行代码没加!!!
原来默认配置里面最下面有一行代码:
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);
	这个时候再插入超范围的数字时,就会直接报错了!!

image
.
image
.
.
.
image
.
.
.
.
.
.
.

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就足够用了!!!!!!

image
.
.
.
.
.
.
.

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后面没有空格

image
.
.
.
.
.
image

字符类型字段使用参考

其中 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能够存储的最大范围!!


image
.
.
.
.
.
.
.
.

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

补充:以后涉及到日期相关字段,都不需要我们自己去填写数据,一般都是系统自动获取,
无需我们可以操作

.
.
.
.
.
.

posted @   tengyifan  阅读(78)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示