字符编码,存储引擎,MySQL字段类型,MySQL字段约束条件

字符编码

查看MySQL默认编码命令:\s
  """
  如果是5.X系列 显示的编码有多种
  	latin1
  	gbk
  如果是8.X系列 显示的统一是utf8mb4
  	utf8mb4是utf8优化版本 支持存储表情
  """

统一字符编码

第一种方式(临时的)

1.首先连接到MySQL : mysql -uroot -proot
2.输入\s,即可查看数据库的字符编码
3.查看数据库的详细编码,输入:show variables like '%char%';
4.设置编码如:
  set character_set_database=utf8;

  set character_set_server=utf8;

当我们打开新窗口时,新窗口不生效,只会在当前窗口生效。关闭再打开,也不生效。

第二种方式,设置全局的数据库字符编码(临时的)

当重启MySQL服务的时候,编码依然会变为原来的字符编码
1.首先连接到MySQL : mysql -uroot -proot
2.查看数据库的详细编码,输入:show variables like '%char%';
3.设置编码
  set global character_set_database=gbk;

  set global character_ser_server=gbk;
打开新的窗口,关闭再打开窗口,都生效,但是当我们重启了MySQL服务后就不生效了,又得重新设置编码。

第三种方式,设置永久的字符编码(永久)

在配置文件中修改数据库的字符编码。
在MySQL安装目录下面,找到my.ini配置文件,如果没有我们可以手动创建一个。
添加固定的配置信息即可
    [mysqld]
    character-set-server=utf8
    collation-server=utf8_general_ci
    [client]
    default-character-set=utf8
    [mysql]
    default-character-set=utf8
最后我们还需要重启一下服务就可以了。

存储引擎

什么是存储引擎

    存储引擎是MylSQL的核心,是数据库底层软件组织,数据库使用存储引擎进行创建、查询、更新和删除
数据。不同的存储引擎提供不同的存储机制、索引技巧、锁级别、事务等功能。存储引擎是基于表的,而非数据库。

查看存储引擎

    show engines;

需要了解的引擎

1、InnoDB存储引擎:

   特点:有诸多功能 安全性较高 存取速度没有MyISAM快
  InnoDB是MySQL5.5版本之后的默认存储引擎,它是为了达到处理巨大数据量的最大性能而设计的,其CPU
效率可能是任何其他基于磁盘的关系型数据库引擎锁不能匹敌的。

  InnoDB支持事务、提供行级锁,每个表的主键不能为空且支持主键自增长,支持外键完整性约束;

2、MyISAM存储引擎:

    特点:存取数据的速度快 但是功能很少 安全性较低
    不支持事务、也不支持外键,使用表级锁控制并发的读写操作,支持全文索引。MyISAM引擎强调快速读取
操作,主要用于高负载的select,对事务完整性没有要求的应用可以用这个引擎来创建表。
    MyISAM类型的表支持三种不同的存储结构:静态型、动态型、压缩型:
    (1)静态型:指定义的表列的大小是固定(即不含有:xblob、xtext、varchar等长度可变的数据类
型)。使用静态格式的表的性能比较高,因为在维护和访问以预定格式存储的数据时,需要的开销比较低,但
这种高性能是以空间为代价换来的,因为在定义的时候是固定的,所以不管列中的值有多大,都会以最大值为
准,占据了整个空间。优点存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多。

    (2)动态型:如果列定义为动态的(xblob, xtext, varchar等数据类型),这时MyISAM就自动使
用动态型,虽然动态型的表占用了比静态型表较少的空间,但带来了性能的降低,因为如果某个字段的内容发
生改变,则其位置很可能需要移动,这样就会导致碎片的产生,随着数据变化的增多,碎片也随之增加,数据
访问性能会随之降低。
    '''
        对于因碎片增加而降低数据访问性这个问题,有两种解决办法:

        ① 尽可能使用静态数据类型;

        ② 经常使用optimize table table_name语句整理表的碎片,恢复由于表数据的更新和删除导致的
空间丢失。如果存储引擎不支持 optimize table table_name则可以转储并重新加载数据,这样也可以减少碎片;
    '''
    (3)压缩型:如果在数据库中创建在整个生命周期内只读的表,则应该使用MyISAM的压缩型表来减少空
间的占用,因为每个记录是被单独压缩的,所以只有非常小的访问开支。

3、Memory存储引擎:

    以内存作为数据存取地 速度快但是断电立刻丢失。 
    Memory存储引擎通过在内存中创建临时表来存储数据。每个表实际对应一个磁盘文件,该文件的文件名
和表名是相同的,类型为.frm。该磁盘文件只存储表的结构,而数据存储在内存中,所以使用该种引擎的表拥
有极高的插入、更新和查询效率。由于所存储的数据保存在内存中,如果mysqld进程发生异常、重启或计算机
关机等等都会造成这些数据的消失。

    默认使用Hash 索引,也可以使用B树型索引。

    Memory存储引擎主要用于内容变化不频繁,或者作为统计操作的中间结果表,便于高效地对中间结果进
行分析并得到最终的统计结果。

4、BLACKHOLE(黑洞引擎)

    该存储引擎支持事务,而且支持mvcc的行级锁,写入这种引擎表中的任何数据都会消失,主要用于做日志
记录或同步归档的中继存储,这个存储引擎除非有特别目的,否则不适合使用。

自定义选择存储引擎

    create table t1(id int)engine=myisam;
    create table t2(id int)engine=innodb;
    create table t3(id int)engine=blackhole;
    create table t4(id int)engine=memory;

创建表的完整语法

    create table 表名(
    	字段名1 字段类型(数字) 约束条件,
    	字段名2 字段类型(数字) 约束条件,
            字段名3 字段类型(数字) 约束条件
    );
    '''
    1.字段名和字段类型是必须的
    2.数字和约束条件是可选的
    3.约束条件可以写多个 空格隔开即可
    	字段名1 字段类型(数字) 约束条件1 约束条件2 约束条件3
    4.最后一行字段结尾不能加逗号
    	极其容易被忽略!!!
    '''

字段类型之整型

按能够存储的数字范围的大小分为:
tinyint				1bytes				
smallint			2bytes
int				4bytes
bigint				8bytes
    需要考虑正负数的问题 如果需要存储负数 则需要占据一个比特位
    create table t5(id tinyint);
    insert into t5 values(-129),(256);
    # 如果是在5.6版本不会报错 会自动处理成最大范围(没有意义)
        步骤1:set global sql_mode = 'STRICT_TRANS_TABLES';
        步骤2:退出客户端 重新登录即可

    整型默认是有符号的,若只需存储无符号值,可增加 unsigned 属性。
    create table t6(id tinyint unsigned);

    int(M)中的 M 代表最大显示宽度,并不是说 int(1) 就不能存储数值10了,不管设定了显示宽度是多少个字
    符,int 都是占用4个字节,即int(5)和int(10)可存储的范围一样。

字段类型之浮点型

float    4个字节  单精度浮点数值
double   8个字节  双精度浮点数值
decimal  对DECIMAL(M,D),如果M>D,为M+2字节否则为D+2字节  精确小数值
上述浮点型从上往下精确度越来越高
    float(255,30)   总共255位 小数位占30位
    double(255,30)  总共255位 小数位占30位
    decimal(65,30)  总共65位 小数位占30位

对于声明语法 DECIMAL(M,D) ,自变量的值范围如下:

M是最大位数(精度),范围是1到65。可不指定,默认值是10。

D是小数点右边的位数(小数位)。范围是0到30,并且不能大于M,可不指定,默认值是0。

例如字段 salary DECIMAL(5,2),能够存储具有五位数字和两位小数的任何值,因此可以存储在salary列中
的值的范围是从-999.99到999.99。

字段类型之字符类型

    其中 char 和 varchar 是最常用到的。char 类型是定长的,MySQL 总是根据定义的字符串长度分配足够的
    空间。当保存 char 值时,在它们的右边填充空格以达到指定的长度,当检索到 char 值时,尾部的空格被删
    除掉。varchar 类型用于存储可变长字符串,存储时,如果字符没有达到定义的位数,也不会在后面补空格。如果字符超出了定义的位数,会报错。

    char(M) 与 varchar(M) 中的的 M 表示保存的最大字符数,单个字母、数字、中文等都是占用一个字符。

"""
课外扩展研究
	char_length()  获取字段数据的长度
	该方法无法直接获取到定长的真实长度 
	因为MySQL在存数据的时候会自动填充空格在取数据的时候又会自动移除空格
	
能不能让MySQL在取数据的时候不自动移除空格
	单次修改
		set session sql_mode = 'pad_char_to_full_length'
"""

数字的含义

字段类型括号内的数字大部分情况下是用来限制存储的长度
但是在整型中并不是用来限制长度 而是用来控制展示长度

create table t12(id int(3));
insert into t12 values(1111);  # 不会报错

create table t13(id int(3) zerofill);  # 位数不够用0填充
insert into t13 values(1);  # 001
insert into t13 values(1111);  # 有几位就展示几位
"""
结论
	以后涉及到整型字段 都无需自己定义长度 直接使用自带的即可
	而针对其他类型的字段 则需要自己添加数字
"""

字段类型之枚举与集合

enum

枚举的使用方式

定义:enum(可能出现的元素列表); //如enum(‘男’,‘女’)
使用:存储数据,只能存储上面定义好的数据

枚举型是利用整数进行管理的,能够2个字节进行管理!每个值,都是一个整数标识,从第一个选项开始为
1,逐一递增!

create table my_enum(

  gender enum(‘男’,‘女’,‘保密’)

)charset utf8;

作用之一:规范数据格式,数据只能是规定的数据中的其中一个

作用之二:节省存储空间(枚举通常有一个别名:单选框),枚举实际存储的是数值,而不是字符串本身

– 插入数据
insert into my_enum values(‘男’),(‘保密’);

– 数值插入枚举元素
insert into my_enum values (1),(2);

– 错误数据
insert into my_enum values(‘male’); – 错误:没有该元素

set

    SET是一个字符串对象,可以有零或多个值,其值来自表创建时规定的允许的一列值。指定包括多个SET
成员的SET列值时各成员之间用逗号(‘,’)间隔开。这样SET成员值本身不能包含逗号。set的容纳范围为64个不
同的成员..set其实和枚举差不多,set指定了一个集合范围,在我们插入数据的时候,需要插入在set范围之
内的元素,如果插入了未被包含的元素,那么就会发出警告。

    CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));//新建表格

    INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');

    select col from myset;//索引值全部显示'a,d';

    insert into myset (col) values('a,b,s');//会发出警告,并且s不会被插入到表格当中

字段类型之日期类型

MySQL支持的日期和时间类型有 YEAR 、TIME 、DATE 、DATETIME 、TIMESTAMP
date				年月日
datetime			年月日时分秒
time				时分秒
year				年

    关于 DATETIME 与 TIMESTAMP 两种类型如何选用,可以按照存储需求来,比如要求存储范围更广,则推荐
使用 DATETIME ,如果只是存储当前时间戳,则可以使用 TIMESTAMP 类型。不过值得注意的是,
TIMESTAMP 字段数据会随着系统时区而改变但 DATETIME 字段数据不会。总体来说 DATETIME 使用范
围更广。

约束条件

无需正负号(一般用于整型字段)

unsigned

零填充

zerofill

非空

not null 
字段值不能为空

默认值

default
create table t19(id int,name varchar(32) default '1111');
插入数据时该字段给了值,就用输入的值,没给值则使用默认值。

唯一值

unique
create table t1(
    id int unique,
);
该字段的值是唯一的,不可重复。

'''多列唯一:多个字段下对应的数据组合到一起的结果不能重复 是唯一的'''
create table t1(
    id int,
    name varchar(32),
    unique(id,name)
  );
id和name组合在一起的值唯一。
(1,'张三')(1,'李四') (2,'张三')可以

主键

primary key(非空且唯一)
create table t1(
    id int primary key,
    name varchar(32)
  );
将id字段设置为主键,那么id不能为空且值不能重复。

自增

auto_increment 自动增加
专门配合主键一起使用 用户以后在添加数据的时候就不需要自己记忆主键值
create table t1(
    id int primary key auto_increment,
    name varchar(32)
  );
之后我们添加数据就不需要写id的值,它会自动增长。
posted @ 2022-05-05 00:28  春游去动物园  阅读(44)  评论(0编辑  收藏  举报