python 之 MySQL
字符编码与配置文件
\s # 查看数据库基本信息(用户、字符编码)
my-default.ini # windows下MySQL默认的配置文件
拷贝上述文件并且重命名为my.ini,修改里面的配置数据
由于5.6版本编码不统一 会造成乱码,我们需要统一修改:utf8
# 添加字符编码相关的配置(百度查看即可)
[mysqld] # mysql服务端
character-set-server=utf8
collation-server=utf8_general_ci
[client] # mysql客户端
default-character-set=utf8
[mysql] # mysql自己的客户端
default-character-set=utf8
'''注意如果配置文件涉及到了mysqld相关的配置修改 那么需要重启服务端才可以生效'''
偷懒操作:在配置文件中的mysql下提前写好用户名和密码 之后直接mysql登录
# 配置文件后面添加
user='root'
password='123' # 自己的密码
存储引擎
可以简单的理解为存储引擎就是针对相同的数据采用的不同的存取策略
show engines; # 查看所有的存储引擎
-
MyISAM
MySQL5.5及之前版本默认的存储引擎
存取数据的速度快,但是功能较少 安全性较低
-
InnoDB
MySQL5.5之后版本默认的存储引擎
存取数据的速度没有MyISAM快,但是支持事务、行锁、外键等诸多功能
安全性较高
-
Memory
基于内存的存储引擎,存取数据极快,但是断电立刻丢失
-
BlackHole
黑洞,任何写进去的数据都会立刻丢失,类似于垃圾站
ps: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;
InnoDB
.frm 表结构
.ibd 表数据、表索引(加快数据查询)
MyISAM
.frm 表结构
.MYD 表数据
.MYI 表索引(加快数据查询)
Memory
.frm 表结构
BlackHole
.frm 表结构
insert into t1 values(1);
insert into t2 values(1);
insert into t3 values(1);
insert into t4 values(1);
创建表的完整语法
create table 表名(
字段名1 字段类型(数字) 约束条件,
字段名2 字段类型(数字) 约束条件,
字段名3 字段类型(数字) 约束条件
)engine=存储引擎;
- 字段名和字段类型是必须的(至少写一个)
- 数字跟约束条件是可选的(可有可无)
- 约束条件可以写多个 空格隔开即可
- 最后一个字段的结尾千万不能加逗号
例
mysql> create table if not exists member(
-> id int auto_increment primary key,
-> name varchar(20) not null,
-> age int not null,
-> gender bit default 1,
-> birth_year int not null,
-> zodiac varchar(10) not null
-> )engine=InnoDB default charset=utf8;;
Query OK, 0 rows affected (0.14 sec)
- if not exists 不存在这个表才会创建
- 如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。
- AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
- PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
- ENGINE 设置存储引擎,CHARSET 设置编码。
字段类型之整型
整型类型 | 字节数 | 范围(无符号) | 范围(有符号) |
---|---|---|---|
TINYINT | 1 字节 | 0 ~ 255 | -128 ~ 127 |
SMALLINT | 2 字节 | 0 ~ 2^16-1 | -2^15 ~ 2^15-1 |
MEDIUMINT | 3 字节 | 0 ~ 2^24-1 | -2^23 ~ 2^23-1 |
INT或INTEGER | 4 字节 | 0 ~ 2^32-1 | -2^31 ~ 2^31 |
BIGINT | 8 字节 | 0 ~ 2^64-1 | -2^63 ~ 2^63 |
-
验证整型是否自带负号
create table aaaa(aa tinyint); insert into aaaa values(-129),(256); # ps:发现自动填写为两个边界值,数据失真,没有实际意义 '''上述所有的整型类型默认都会带有负号'''
-
自定义移除负号
'''unsigned 约束条件之一 意思是不需要负号''' create table t7(id tinyint unsigned); insert into t7 values(-129),(256);
字段类型之浮点型
类型 | 大小 | 描述 |
---|---|---|
FLOAT | 4 字节 | 单精度浮点数值 |
DOUBLE | 8 字节 | 双精度浮点数值 |
DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2字节 否则为D+2 | 精确小数值 |
使用
float(255,30) # 第一个数表示总共多少位 第二个数表示小数占多少位
double(255,30)
decimal(65,30)
验证精确度问题
float < double < decimal
mysql> create table asas(id float(255,30));
Query OK, 0 rows affected, 1 warning (0.03 sec)
mysql> create table fgh(id double(255,30));
Query OK, 0 rows affected, 1 warning (0.03 sec)
mysql> create table hjk(id decimal(65,30));
Query OK, 0 rows affected (0.04 sec)
mysql> insert into asas values(1.11111111111111111111111111111);
Query OK, 1 row affected (0.01 sec)
mysql> insert into fgh values(1.11111111111111111111111111111);
Query OK, 1 row affected (0.01 sec)
mysql> insert into hjk values(1.11111111111111111111111111111);
Query OK, 1 row affected (0.01 sec)
mysql> select * from asas;
+----------------------------------+
| id |
+----------------------------------+
| 1.111111164093017600000000000000 |
+----------------------------------+
1 row in set (0.00 sec)
mysql> select * from fgh;
+----------------------------------+
| id |
+----------------------------------+
| 1.111111111111111200000000000000 |
+----------------------------------+
1 row in set (0.00 sec)
mysql> select * from hjk;
+----------------------------------+
| id |
+----------------------------------+
| 1.111111111111111111111111111110 |
+----------------------------------+
1 row in set (0.00 sec)
"""
一般情况下float足够使用了
如果想追求非常完美的精确度 可以使用字符串来代替
"""
字段类型之字符类型
-
char(定长)
char(5)
最多只能存储 5 个字符,如果超出范围直接报错,如果不超出范围,则用会在右边使用空格填充至 X 个字符 -
varchar(变长)
varchar(5)
最多存储 5 个字符,如果超出范围直接报错,如果不超出范围,则有几位就存几位
验证两者的区别
create table t11(id int, name char(4));
create table t12(id int, name varchar(4));
-
结果验证,超出范围两者都会报错
注意sql_mode='strict_trans_tables'
-
验证定长和变长特性
char_length() # 统计字段数据的长度
默认情况下char在存储的时候针对没有满足固定位数的字符会自动填充空格
然后在读取的时候又会自动将填充的空格移除 如果想取消该机制 需要sql_mode
set global sql_mode='strict_trans_tables,pad_char_to_full_length';
上述目录是替换 不是新增 所以之前的配置也要写上
-
char VS varchar
char
整存整取 速度快
浪费存储空间
varchar
节省存储空间
存取数据的速度慢于charchar(4) a son jacktom lili varchar(4) 1bytes+a1bytes+son1bytes+jack1bytes+tom1bytes+lili 存取数据都需要操作报头(耗时) '''存储人的姓名>>>:varchar''' # 两者使用频率都很高 现在默认很多时候是varchar
数字的含义
数字大部分情况下都是用来限制字段的存储长度,但是整型除外
不是用来限制存储的长度,而是展示的长度
create table t13(id int(3));
create table t14(id int(3) zerofill);
以后涉及到整型字段的定义,类型后面不需要加括号写数字 除非有业务需求必须固定位数
字段类型之枚举与集合
枚举
多选一
eg:性别(男 女 其他)
create table t15(
id int,
name varchar(32),
gender enum('male','female','others')
);
集合
多选多(包含多选一)
eg:爱好(唱 跳 rap)
create table t16(
id int,
name varchar(32),
hobbies set('read','run','music','rap')
);
字段类型之日期类型
类型 | 描述 |
---|---|
date | 年月日 |
datetime | 年月日时分秒 |
time | 时分秒 |
year | 年份 |
mysql> create table t17(
-> id int,
-> name varchar(32),
-> birth date,
-> reg_time datetime,
-> study_time time,
-> join_time year
-> );
Query OK, 0 rows affected (0.04 sec)
mysql>
mysql> insert into t17 values(1,'jason','2022-11-11','2000-11-11 11:11:11','11:11:11','1995');
Query OK, 1 row affected (0.01 sec)
mysql> select * from t17;
+------+-------+------------+---------------------+------------+-----------+
| id | name | birth | reg_time | study_time | join_time |
+------+-------+------------+---------------------+------------+-----------+
| 1 | jason | 2022-11-11 | 2000-11-11 11:11:11 | 11:11:11 | 1995 |
+------+-------+------------+---------------------+------------+-----------+
1 row in set (0.00 sec)
字段约束条件
insert into 表名 vlaues() # 默认按照创建表的字段顺序添加
insert into 表名(字段) vlaues() # 可以自定义字段顺序
-
unsigned 无负号
id int unsigned
-
zerofill 零填充
id int zerofill
-
not null 非空
name varchar(32) not null
-
default 默认值
name varchar(32) default 'jason'
-
unique 唯一值
id int unique 单列唯一
host varchar(32) port int unique(host,port) # 联合唯一