字符编码与配置、数据库存储引擎、创建表的语法之字段类型

字符编码与配置文件

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

 

posted @ 2022-11-23 21:57  莫~慌  阅读(164)  评论(0编辑  收藏  举报