ToB企服应用市场:ToB评测及商务社交产业平台

标题: 配置文件 数据库存储引擎 严格模式 MySQL字段基本数据类型 [打印本页]

作者: 宝塔山    时间: 2022-11-23 18:14
标题: 配置文件 数据库存储引擎 严格模式 MySQL字段基本数据类型
目录

字符编码与配置文件

\s查看MySQL相关信息
  1. 相关信息有:当前用户、版本、编码、端口号
  2. MySQL5.6及之前的版本编码需要人为统一 之后的版本已经全部默认统一
  3. 如果想要永久修改编码配置 需要操作配置文件my-default.ini
复制代码

注意事项:
修改配置文件my-default.ini
  1. 2.默认的配置文件是my-default.ini
  2.         拷贝上述文件并重命名为my.ini
  3.    
  4. 直接拷贝字符编码相关配置即可无需记忆
  5.     [mysqld]
  6.         character-set-server=utf8mb4
  7.         collation-server=utf8mb4_general_ci
  8.     [client]
  9.         default-character-set=utf8mb4
  10.     [mysql]
  11.         default-character-set=utf8mb4
  12. ps:
  13.     1.utf8mb4能够存储表情 功能更强大
  14.     2.utf8与utf-8是有区别的 MySQL中只有utf8
  15. 修改了配置文件中关于[mysqld]的配置 需要重启服务端
  16.   
  17. """
  18. 利用配置文件我们可以偷懒
  19.         将管理员登录的账号密码直接写在配置文件中 之后使用mysql登录即可
  20.         [mysql]
  21.                 user='root'
  22.                 password=123
  23. """
复制代码
解决5.6版本字符编码问题

  1. 补充说明:
  2. 1. mysql中'utf8'和'utf-8'这两个是有区别的:mysql中只允许有utf8.
  3. 2. [client]表示第三方的客户端 [mysql]表示自己写的客户端 [server]表示服务端.
  4. 3. 如果是8.0版本的mysql,则默认编码是utfmb4.
复制代码
配置文件什么时候加载?

在mysqld的配置文件中加一串不明所以的代码

重启服务端,登录mysql:

会直接报错 连密码都输不进去了。所以说配置文件是在客户端启动之前加载的。
偷懒操作:输入mysql直接登录root账户

修改配置文件:

实现不输入密码直接登录,原来是账号密码写配置文件里了:

数据库存储引擎

存储引擎简介

数据库针对数据采取的多种存取方式
  1. 举例:
  2. 不同的引擎针对相同的数据 采取的方式不一样
  3. 给小勇,小红一份数据:
  4. 小勇 ---> 存电脑 取的时候:小勇乖乖拿过来
  5. 小红 ----> 存网盘 取的时候:小红叫我过来拿
复制代码
查看引擎 show engines;

在mysql中使用show engines;命令查看引擎:

表格从左到右 ---> 引擎 模式 描述 事务 断点
事务:当两个不同的数据库交互时 例如小红转账时 银行瘫痪 只扣钱没加钱 事务可以让时间倒流
需要了解的四个存储引擎

了解不同存储引擎底层文件个数

查看表的存储引擎:
  1. 了解不同存储引擎底层文件个数
  2.         create database db2;
  3.         use db2;
  4.         create table t1(id int) engine=innodb;
  5.         create table t2(id int) engine=myisam;
  6.           create table t3(id int) engine=memory;
  7.         create table t4(id int) engine=blackhole;
  8.         '''
  9.         1.innodb两个文件
  10.                 .frm        表结构
  11.                 .ibd        表数据(表索引)
  12.         2.myisam三个文件
  13.                 .frm        表结构
  14.                 .MYD        表数据
  15.                 .MYI        表索引
  16.         3.memory一个文件
  17.                 .frm        表结构
  18.         4.blackhole一个文件
  19.                 .frm        表结构
  20.         '''
  21.         insert into t1 values(1);
  22.         insert into t2 values(1);
  23.         insert into t3 values(1);
  24.         insert into t4 values(1);
  25. '''
  26. 表索引相当于书的目录 用于加快数据查询
  27. memery 基于内存所以没有表数据 文件是操作系统暴露出来给用户操作硬盘的快捷方式'''
  28. ps:MySQL默认忽略大小写
复制代码
验证memory\blackhole 数据消失

t3 重启服务数据消失:

t4 数据直接消失:

创建表的完整语法(重要)
  1. '''
  2. create table 表名(
  3.         字段名 字段类型(数字) 约束条件,
  4.         字段名 字段类型(数字) 约束条件,
  5.         字段名 字段类型(数字) 约束条件
  6. );
  7. '''   
  8. 1.字段名和字段类型是必须的
  9. 2.数字和约束条件是可选的
  10. 3.约束条件也可以写多个 空格隔开即可
  11. 4.'''最后一行结尾不能加逗号'''
  12. ps:编写SQL语句报错之后不要慌 仔细查看提示 会很快解决
  13.             near ')' at line 7
复制代码
字段类型之整型
  1. tinyint                        1bytes                        正负号(占1bit)
  2. smallint                2bytes                        正负号(占1bit)
  3. int                        4bytes                        正负号(占1bit)
  4. bigint                        8bytes                        正负号(占1bit)
复制代码

验证整型默认是否携带正负号

create table t5(id tinyint);
insert into t5 values(-129),(128);
结果是-128和127 也就意味着默认自带正负号
正负数也要占用一个bit位 故只能存128
手机号(13位)存储时,Int的位数不够(10位) 需要使用bigint、字符串。
取消正负号

我们也可以取消正负号,使用约束条件unsigned.
create table t6(id tinyint unsigned);
insert into t6 values(-129),(128),(1000);

严格模式

当我们在使用数据库存储数据的时候 如果数据不符合规范
应该直接报错而不是擅自修改数据 这样会导致数据的失真(没有实际意义)
正常情况下是应该报错 但是我们之前修改了配置文件 将严格模式的配置代码给删掉了
查看当前数据库是否有严格模式

代码的意思是找出所有带mode的配置信息:
show variables like '%mode%';

这表示没有开启严格模式
临时修改
  1.         set session sql_mode='strict_trans_tables';
  2.             在当前客户端有效 当前用户有效 用户退出之后重新登录无效
  3.         set global sql_mode='strict_trans_tables';
  4.             在当前服务端有效 只要服务器没重启 对所有用户都有效
复制代码

永久修改

改配置文件:

字段类型之浮点型
  1. 语法:
  2. float (存储数字的位数,小数点后面的数)
  3. float(20,10)
  4.         总共存储20位数 小数点后面占10
  5. double(20,10)
  6.         总共存储20位数 小数点后面占10
  7. decimal(20,10)
  8.         总共存储20位数 小数点后面占10
  9. create table t7(id float(60,20));
  10. create table t8(id double(60,20));
  11. create table t9(id decimal(60,20));
  12. insert into t7 values(1.11111111111111111111);
  13. insert into t8 values(1.11111111111111111111);
  14. insert into t9 values(1.11111111111111111111);
  15. 三者的核心区别在于精确度不同
  16.         float        <        double  <         decimal
复制代码

验证三者精确度:

字段类型之字符类型(重要)
  1. char
  2.         定长
  3.             char(4)  最多存储四个字符 超出就报错 不够四个空格填充至四个
  4. varchar
  5.         变长
  6.             varchar(4) 最多存储四个字符 超出就报错 不够则有几位存几位
  7. create table t10(id int, name char(4));
  8. create table t11(id int, name varchar(4));
  9. insert into t10 values(1, 'jason1');
  10. insert into t11 values(1, 'jason2');
  11. ps:char_length()获取字段存储的数据长度
  12. 默认情况下MySQL针对char的存储会自动填充空格和删除空格
复制代码
数字限制存储的字符长度:

验证定长和变长

取消mysql自动去掉空格的特性

输入:
set global sql_mode='strict_trans_tables,pad_char_to_full_length';
注意这修改的是服务端层面,重启服务端则失效。

重新登录:

char VS varchar
  1. char
  2.         优势:整存整取 速度快
  3.         劣势:浪费存储空间
  4. varchar
  5.             优势:节省存储空间
  6.                劣势:存取数据的速度较char慢
  7. """
  8. char与varchar的使用需要结合具体应用场景
  9. char(32)存中国人名字 劣势 因为大多数人名字都是两三个字 少部分人名字长
  10. 存姓名 用varchar
  11. 存手机号码 男女性别 用char
  12. """
复制代码
为什么varchar的存取速度慢?
  1. # 为什么varchar存取速度较慢?
  2. char取固定位数 直接拿就好了
  3. jasonjacktomjerry 不知道存的时候是几位
  4. 不知道要取几位的时候 使用报头
  5. 存数据时用1bytes作为报头
  6. 取的时候先取一个字节的报头 解析数据真实的长度:
  7. 1bytes+jack 1bytes+tony 1bytes+jason 1bytes+kevin 1bytes+tom 1bytes+jerry
  8. 报头1bytes不够用怎么办?
复制代码
补充


int类型中数字的含义

数字在很多地方都是用来表示限制存储数据的长度
但是在整型中数字却不是用来限制存储长度
字段类型之枚举与集合

枚举
  1. 多选一
  2. create table t15(
  3.         id int,
  4.           name varchar(32),
  5.    gender enum('male','female','others')
  6. );
  7. insert into t15 values(1,'tony','猛男');
  8. insert into t15 values(2,'jason','male');
  9. insert into t15 values(3,'kevin','others');
复制代码
集合

集合包括枚举!
  1. 多选多(多选一)
  2. create table t16(
  3.         id int,
  4.           name varchar(16),
  5.    hobbies set('basketabll','football','doublecolorball')
  6. );
  7. insert into t16 values(1,'jason','study');
  8. insert into t16 values(2,'tony','doublecolorball');
  9. insert into t16 values(3,'kevin','doublecolorball,football');
复制代码
字段类型之日期类型
  1. datetime                年月日时分秒
  2. date                        年月日
  3. time                        时分秒
  4. year                        年
  5. create table t17(
  6.         id int,
  7.           name varchar(32),
  8.         register_time datetime,
  9.         birthday date,
  10.         study_time time,
  11.         work_time year
  12. );
  13. insert into t17 values(1,'jason','2000-11-11 11:11:11','1998-01-21','11:11:11','2000');
  14. ps:以后涉及到日期相关字段一般都是系统自动回去 无需我们可以操作
  15. '''
  16. 以后所有的表都要用日期类型
  17. datatime可以切割 想怎么切怎么切 用mysql内置函数 流程控制'''
复制代码

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4