字符编码与配置、数据库存储引擎、创建表的语法之字段类型
\s 查看MySQL相关信息
当前用户、版本、编码、端口号
MySQL5.6及之前的版本编码需要人为统一,之后的版本已经全部默认统一
如果想要永久修改编码配置,需要操作配置文件
修改编码配置
1.默认的配置文件是my-default.ini
2.拷贝上述文件并重命名为my.ini
直接拷贝字符编码相关配置即可(无需记忆)
[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_general_ci [client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4
ps:
- utf8mb4能够存储表情,功能更强大
- utf8与utf-8是有区别的 MySQL中只有utf8
3. 修改了配置文件中关于[mysqld]的配置,需要重启服务端
再次查看编码,都变成了utf8:
PS:利用配置文件我们可以偷懒
将管理员登录的账号密码直接写在配置文件中,之后使用mysql登录即可
[mysql] user='root' password=123
使用mysql登录,发现当前用户默认就是管理员。
什么是存储引擎
数据库针对数据采取的多种存取方式
查看常见存储引擎的方式
show engines;
需要了解的四个存储引擎
MyISAM
是MySQL5.5之前默认的存储引擎
特点:存取数据的速度快,但是功能较少,安全性较低
InnoDB
MySQL5.5之后默认的存储引擎
支持事务、行锁、外键等操作 存取速度没有MyISAM快,但是安全性更高
Memory
基于内存存取数据,仅用于临时表数据存取
BlackHole
任何写入进去的数据都会立刻丢失
了解不同存储引擎底层文件个数
create database db2;
use db2;
用下列命令创建四张表:
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三个文件 .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);
t1,t2,t3三个表中都有数据,t4中没有,验证了BlackHole对任何写入进去的数据都会立刻丢失。
重启服务,验证Memory引擎仅用于临时表数据存取
说明Memory引擎仅用于临时表数据存取。
ps:MySQL默认忽略大小写
create table 表名(
字段名 字段类型(数字) 约束条件,
字段名 字段类型(数字) 约束条件,
字段名 字段类型(数字) 约束条件
);
注意事项:
1.字段名和字段类型是必须的
2.数字和约束条件是可选的
3.约束条件也可以写多个 空格隔开即可
4.最后一行结尾不能加逗号
tinyint 1bytes 正负号(占1bit)
smallint 2bytes 正负号(占1bit)
int 4bytes 正负号(占1bit)
bigint 8bytes 正负号(占1bit)
验证整型默认是否携带正负号
结果是-128和127,也就意味着默认自带正负号。
我们也可以取消正负号:
create table t6(id tinyint unsigned);
发现t6中最小的数字是0,最大的数字是255。这种操作虽然取消了正负号,但是却改变了我们原本存储的数据。这是不正常的。
严格模式:
当我们在使用数据库存储数据的时候,如果数据不符合规范,应该直接报错而不是擅自修改数据,这样会导致数据的失真(没有实际意义)。
出现上面情况的原因是我们之前不小心改了配置文件。
如何查看当前版本的严格模式?
show variables like '%mode%';
如何修改严格模式?
1.临时修改
# 只在当前窗口有效
set session sql_mode='strict_trans_tables';
# 全局有效
set global sql_mode='strict_trans_tables';
# 修改完后,重新进入服务端生效
2.永久修改
直接修改配置文件,如下图,将红色框中的那行文字添加到mysqld中。
float(20,10) 总共存储20位数 小数点后面占10 double(20,10) 总共存储20位数 小数点后面占10 decimal(20,10) 总共存储20位数 小数点后面占10
上面三种都可以用于存储浮点型数据,三者的核心区别在于精确度不同
float < double < decimal
char定长
char(4) 最多存储四个字符,超出就报错,不够四个空格填充至四个
ps:char_length()获取字段存储的数据长度
默认情况下MySQL针对char的存储会自动填充空格和删除空格
可以通过添加下面这条命令来获取数据的真实存储状态(了解)
set global sql_mode='strict_trans_tables,pad_char_to_full_length';
varchar变长
varchar(4) 最多存储四个字符,超出就报错,不够则有几位存几位
char和varchar对比
char
优势:整存整取 速度快
劣势:浪费存储空间
varchar
优势:节省存储空间
劣势:存取数据的速度较char慢
比如在存储下方的字符时,char字段类型使用空格填充,varchar就需要使用报头,记录每一次记录的字符的长度,而报头需要占用一个字节
jacktonyjasonkevintomjerry
1bytes+jack1bytes+tony1bytes+jason1bytes+kevin1bytes+tom1bytes+jerry
数字在很多地方都是用来表示限制存储数据的长度
但是在整型中数字却不是用来限制存储长度,而是用来控制展示的长度
以后写整型无需添加数字,因为int默认展示11位数字
enum枚举(多选一)
意思就是在给表添加记录的时候,枚举类型的值只能从创建时设定的值中选一个,否则都会报错。
枚举 多选一 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集合(多选多或多选一)
集合的选择条件是让我们在给定的数据值中选择一个或多个,如果一个也没有就会报错。
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');
字段类型之日期类型
MySQL支持的日期和时间类型有 YEAR 、TIME 、DATE 、DATETIME 、TIMESTAMP,几种类型比较如下:
涉及到日期和时间字段类型选择时,根据存储需求选择合适的类型即可。
datetime 年月日时分秒
date 年月日
time 时分秒
year 年
关于 DATETIME 与 TIMESTAMP 两种类型如何选用,可以按照存储需求来,比如要求存储范围更广,则推荐使用 DATETIME ,如果只是存储当前时间戳,则可以使用 TIMESTAMP 类型。不过值得注意的是,TIMESTAMP 字段数据会随着系统时区而改变但 DATETIME 字段数据不会。总体来说 DATETIME 使用范围更广。
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');