my-default.ini:Windows下MySQL默认的配置文件
拷贝配置文件并重命名为my.ini,修改此文件即可
\s:查看数据库基本信息,如果发现客户端与服务端的编码不统一,那么输入中文会造成乱码,所以我们需要统一修改为utf8
添加字符编码相关的配置:
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
如果配置文件涉及到了服务端相关的配置修改,那么需要重启服务端才能生效
由于每次启动mysql都会加载配置,那么我们可以偷懒将用户密码配置在配置文件中,以后就可以使用mysql直接登录
可以简单的理解为使用不同的存储策略存储数据
查看所有的存储引擎:show engines;
需要掌握的存储引擎:
# MySQL中默认是大小写不敏感的(不区分大小写)
create table t1(id int) engine=innodb;
# .frm 表结构
# .ibd 表数据、表索引(加快数据查询)
create table t2(id int) engine=myisam;
# .frm 表结构
# .MYD 表数据
# .MYI 表索引(加快数据查询)
create table t3(id int) engine=memory;
# .frm 表结构
# 表数据在内存中
create table t4(id int) engine=blackhole;
# .frm 表结构
insert into t1 values(1);
select * from t1; # 1
insert into t2 values(1);
select * from t2; # 1
insert into t3 values(1);
select * from t3; # 1,重启服务端丢失
insert into t4 values(1);
select * from t4; # 没有数据
create table 表名(
字段名1 字段类型(数字) 约束条件,
字段名2 字段类型(数字) 约束条件,
字段名3 字段类型(数字) 约束条件
) engine=存储引擎;
# 字段名与字段类型必须填写至少一个
# 数字与约束条件可以不写
# 约束条件可以写多个,使用空格隔开
# 最后一个字段的末尾不能够有逗号
tinyint 1bytes
smallint 2bytes
int 4bytes
bigint 8bytes
1bytes等于8bit,可以保存0~255,但是默认要使用一位保存正负状态,所以是-128~127
create table t1(id tinyint);
insert into t1 values(256),(-129);
select * from t1; # 127 -128
# 发现超过范围的数值都自动填写为最接近的边界值
# 使用约束条件移除正负号,使数字的范围为0~255
create table t2(id tinyint unsigned);
insert into t2 values(-129),(256);
select * from t2; # 0 255
# nusigned 约束条件之一,意思是不需要符号
如果插入数据超过范围自动修改,可以使用修改配置文件让其超出范围报错
[mysqld]
sql_mode='STRICT_TRANS_TABLES'
也可以使用命令临时修改
set session sql_mode='strict_trans_tables' # 当前客户端操作界面有效
set global sql_mode='STRICT_TRANS_TABLE' # 服务端重启前有效
float
double
decimal
这三个都可以存储浮点型数据,但是精确度各不一样
create table t1(num float(255,30)); # float括号内第一个表示一共多少位数,第二个表示小数使用多少位
create table t2(num double(255,30));
create table t3(num decimal(65,30));
insert into t1 values(1.11111111111111111111111111);
insert into t2 values(1.11111111111111111111111111);
insert into t3 values(1.11111111111111111111111111);
select * from t1; # 1.111111164093017600000000000000
select * from t2; # 1.111111111111111200000000000000
select * from t3; # 1.111111111111111111111111110000
# 一般情况下使用float就足够了,如果想要完全的精确,可以使用字符类型来替代
char:定长
varchar:变长
char(4):最大只能存储4个字符,超出范围直接报错;如果字符不够则使用空格填充至4个字符
varchar(4):最大只能存储4个字符,超出范围直接报错;如果字符不够不会填充,有几个字符就存储几个字符
create table t1(name char(4));
create table t2(name varchar(4));
insert into t1 values('abcde');
insert into t1 values('abcd');
insert into t2 values('abcde');
insert into t2 values('abcd');
# 超出范围都会报错
insert into t1 values('a');
insert into t2 values('a');
select char_length(name) from t1;
select char_length(name) from t2;
# 使用char_length()查看字符长度,发现两个存储的长度都是1
# 因为默认情况下,char在存储时会针对不满足固定字符的填充空格,读取的时候会将末尾的空格移除
insert into t1 values('a ');
select char_length(name) from t1; # 1
# 如果想要取消该机制需要sql_mode
set global sql_mode='strict_trans_tables,pad_char_to_full_length';
# 是替换而不是新增,所以要将之前的配置也写上
char:整存整取,速度快,但是浪费存储空间
varchar:节省存储空间,但是存取速度慢
数字大多数情况下都是用来限制字段的存储长度,整型除外
整型是用来表示展示的长度
create table t1(id int(5));
# 不能太明显的看出来,使用约束条件填充0
create table t2(id int(5) zerofill);
insert into t2(123);
select * from t2; # 00123
# 以后涉及到整型字段的定义,一般不需要在括号内写数字,除非是业务需求
# 枚举:设定几个数值,之后选择其中之一填写
create table t1(gender enum('male','female','other'));
# 集合:设定几个数值,之后选择其中数值填写
create table t2(hobbies set('a','b','c'));
date 年月日
time 时分秒
datetime 年月日时分秒
year 年份
create table t1(
birthday date,
study_time time,
reg_time datetime,
join_time year
);
# 传入指定的数据
insert into t1 values('2000-11-11','11:11:11','2000-11-11 11:11:11','1996');
1. unsigend # 无符号
create table t1(id int unsigend);
2. zerofill # 以零填充
create table t2(id int(5) zerofill);
3. not null # 非空,指定一个字符段必须填写(空字符也算填写了)
create table t3(id int,name varchar(32) not null);
insert into t3(id) values(1); # 当指定字符段添加数据时,其余字符段值为null,约束为非空后必须填写该字符段
4. default # 默认值
create table t4(id int,name varchar(32) default 'jason');
isnert into t4(id) values(1); # 当指定字符段填写时,其余字符段为null,使用默认值设置为其他
5. unique # 唯一值
create table t5(id int unique); # 单列唯一,设定的字符段不能出现重复的数据
insert into t5 values(1);
insert into t5 values(1); # 报错
create table t6(host varchar(32),port int,unique(host,port)); # 联合唯一,括号内的加起来不能重复,单独可以重复
create table t6 values('127.0.0.1',8080);
create table t6 values('127.0.0.1',8081);
create table t6 values('127.0.0.2',8080);
create table t6 values('127.0.0.1',8080); # 两个都相同,报错