编码与配置
-
- 怎么样才能查看数据库的基本信息?
- \s
-
- 在配置文件中修改MYSQL的默认配置(5.6版本)
- 将MYSQL文件下的my-default.ini进行拷贝重命名为my.ini,在里面修改就可
- 添加字符编码配置直接百度或:配置文件涉及到mysqld相关配置时,需要重启客户端生效
- 在配置文件中可以提前写好用户名和密码后直接登录mysql
[mysqld] character-set-server=utf8 collation-server=utf8_general_ci [client] default-character-set=utf8 [mysql] default-character-set=utf8
存储引擎
- 查看所有存储引擎
- show engines;
- show engines;
- 存储引擎的类型
- MYISAM
存取速度快,功能少,安全性低。mysql5.5之前默认- InnoDB
存取速度较慢,安全性较高,支持事务,行锁,外键等功能。mysql5.5后默认- Memory
基于内存的存储引擎,存取速度很快,断电立即丢失- BlackHole
黑洞,写进去的数据会立刻丢失,类似于垃圾站 - mysql对大小写不敏感(默认的)
- 不同存储引擎之间底层文件是有区别的:(验证)
- 1.创建InnoDB类型存储引擎的表
- create table t1(id int) engine=innodb;
底层文件: .frm 表结构 .ibd 表数据,表索引(加快数据查询)- 存入数据
insert into t1 values(1) - 2.创建MYISAM类型存储引擎的表
- create table t2(id int) engine=MYISAM;
底层文件: .frm 表结构 .MYD 表数据 .MYI 表索引(加快数据查询)- 存入数据
insert into t1 values(1) - 3.创建Memory类型存储结构的表
- create table t3(id int) engine=Memory;
.frm 表结构- 存入数据
insert into t1 values(1) - 4.创建BlackHole类型存储结构的表
- create table t4(id int) engine=BlackHole;
.frm 表结构- 存入数据
insert into t1 values(1)
- 1.创建InnoDB类型存储引擎的表
创建表的完整语法
create table 表名(
字段名1 字段类型(数字) 约束条件,
字段名2 字段类型(数字) 约束条件,
字段名3 字段类型(数字) 约束条件
)engine=存储引擎;
-
- 字段名和字段类型是必须的,至少需要一个
-
- 数字跟约束条件是可选的,可以都不出现
-
- 约束的条件可以写多个,空格隔开即可、
-
- 最后一个字段结尾不可以加逗号
字段的类型
- 括号内数字的含义
- 数字基本都是用来限制字段的存储长度(除了整型),不是限制长度,而是用来展示长度。
create table t13(id int(3)); create table t14(id int(3) zerofill); zerofill 如果值长度不够,在前面补0表示 - 总结
- 涉及整型字段的含义,类型后面不需要加括号写数字,除非有业务需求,需要固定位数
字段类型之整型
tinyint 1bytes 没有负号: 0~255 有负号: -128~127
smallint 2bytes 没有负号: 0~65535 有负号: -32768~32767
int 4bytes 没有负号: 0~4294967295 有负号: -2147483648~2147483647
bigint 8bytes 没有负号: 0 ~ 2^64-1 有负号: -2^63 ~ 2^63-1
- 验证整型是否自带负号
-
- 新增表名
- 新增表名
-
- 往表内添加超出范围的数据
- 往表内添加超出范围的数据
-
- 查看表内的数据
- 查看表内的数据
-
- 自定义移除负号(在字段类型后添加unsigned)
-
- 新增表名
- 新增表名
-
- 往表内添加超出范围的数据
- 往表内添加超出范围的数据
-
- 查看表内数据
- 查看表内数据
-
- 总结:
1. unsigned是约束条件之一,意思是不需要负号 2. 插入的数据值超出了数据类型的范围,修该插入的数据值也是没有意义的 3. 数据库的配置文件修改后可能会再插入的时候不提示报错。正常没修改的数据库插入超出范围会报错- 如何修改数据库内插入超出范围的报错提示:
- 方式1: 命令临时修改
第一种: set session sql_mode='strict_trans_tables' # 当前客户端的操作界面有效第二种: set global sql_mode='STRICT_TRANS_TABLES' # 服务端不重启永久有效 - 方式2: 配置文件永久修改
[mysqld] sql_mode='STRICT_TRANS_TABLES'
- 方式1: 命令临时修改
- 如何修改数据库内插入超出范围的报错提示:
字段类型之浮点型
# 第一个数表示总共多少位,第二个数表示小数占多少位
float 使用方式: float(255,30)
double 使用方式: double(255,30)
decimal 使用方式: decimal(65,30)
- 验证精准度
- float精准度
创建表: create table t4(id float(255,30)); 存入数据: insert into t4 values(1.1111111111111111111111111111111111); 查看数据: select * from t4; - double精准度
创建表: create table t5(id double(255,30)); 存入数据: insert into t5 values(1.1111111111111111111111111111111111); 查看数据: select * from t5; - decimal精准度
创建表: create table t11(id decimal(65,30)); 存入数据: insert into t11 values(1.1111111111111111111111111111111111); 查看数据: select * from t5;
- float精准度
- 数据的精准度
float < double < decimal 一般情况下float足够使用了 如果想追求非常完美的精确度 可以使用字符串来代替
字段类型之字符类型(需要手动指定数字)
char 定长 char()括号里是几,就最大能存储几个字符,超出范围报错
不超出范围,用空格填充到四个字符
varchar 变长 varchar()括号里是几,就最大能存储几个字符,超出范围报错
不超出范围,能有几位就存几位
- 验证区别
超出范围二者都会报错,使用char_length()可以统计数据的长度 注意sql_mode='strict_trans_tables'- char
- varchar
我们看到两者感觉上并没有什么区别,这是因为,默认情况下char存储的时候,没有满足长度会自动填充空格,读取时又会取消空格,所以看起来没什么区别 <取消该机制需要使用sql_mode> 下面目录是替换,不是新增,之前的配置也要写 set global sql_mode='strict_trans_tables,pad_char_to_full_length'; - char
- char与varchar哪个更好呢
- char整存整取,速度快,但是浪费存储空间
- varchar节省存储空间,但是速度比char慢
char(4): a son jacktom lili # 空格占位 varchar(4): 1bytes+a1bytes+son1bytes+jack1bytes+tom1bytes+lili 存取数据都需要操作报头(耗时)- 二者使用都很频繁,很多时候默认为varchar
字段类型之枚举与集合
枚举enum
- 多选一
例:性别(男,女,其他) 我们只能选择一次性别
create table t15(
id int,
name varchar(32),
gender enum('male','female','others')
);
- 结果
- 只能选择一个在里面的,不在选择里面的写入会报错
- 只能选择一个在里面的,不在选择里面的写入会报错
集合set
- 多选多(包含多选一)
例:爱好(唱,跳,rap,篮球) 我们可以选择多个爱好
create table t17(
id int,
name varchar(32),
hobbies set('sing','jump','rap','basketball')
);
- 结果
- 可以选择里面的多个或一个,不在选择里面的写入会报错
- 可以选择里面的多个或一个,不在选择里面的写入会报错
字段类型之日期类型
date 年月日
datetime 年月日时分秒
time 时分秒
year 年
- 例
创建表: create table t18( id int, name varchar(32), birth date, reg_time datetime, study_time time, join_time year ); 添加数据: insert into t18 values(1,'tom','2011-11-11','2000-11-11 11:11:11','11:11:11','1995'); 查看数据: select * from t18; - 实操结果
字段的约束条件
创建表:
create table t19(id int,name varchar(32));
往表中添加数据:
insert into t19(name,id) values('tom',1); # 可以自定义字段顺序
insert into t19 values(2,'ami');
查看表数据:
select * from t19;
-
- unsigned(无负号)
create table t20(id int unsigned,name varchar(32));
-
- zerofill(零填充)
create table t20(id int zerofill,name varchar(32));
-
- not null(非空)
create table t20(id int,name varchar(32) not null);
-
- default(默认值)
create table t20(id int,name varchar(32) default 'jason');
-
- unique(唯一值)
create table t20(id int unique,name varchar(32)); # 单列唯一 使用后所在的字段名数据不能重复- 操作
create table t20(id int,name varchar(32) default 'jason'); # 联合唯一 使用后组合后的数据不能重复- 操作