Mysql字符编码,存储引擎,表的完整语法,字段类型,严格模式

字符编码与配置文件

	在MySQL中 可以使用\s来查看相关信息。当前登录的用户,MySQL的版本,编码与端口号。
想要永久修改编码配置需要操作配置文件。
  配置文件在安装目录下的:my_default.ini
    拷贝并重命名为 my.ini
===================================================================================
[mysqld]
    character-set-server=utf8mb4
    collation-server=utf8_general_ci
	sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES   # 严格模式
[client]  # 第三方客户端设置
    default-character-set=utf8mb4
[mysql]  # mysql的客户端
    default-character-set=utf8mb4
===================================================================================    
    修改后需要重启MySQL服务
  使用utf8mb4 编码,此编码能把表情完好无损的保存下来,功能强大。
	注意: 5.6 之前的版本 才需要手动配置,之后的版本全部默认做了统一。
    
    也可以把用户名与密码放入mysql客户端内,可以在登陆的时候不需要输入用户名密码就可登录
        user='root'
		password=123

数据库存储引擎

存储引擎  数据库 针对数据采取的多种存取方式
查看常见的存储引擎的代码:
show engines;

常用的四个引擎及其后缀

一、MyISAM 
 	 MySQL5.5版本之前的默认存储引擎
    存取速度快,功能少,安全性较低
    3个文件后缀:
    	1. .frm   # 表结构
       2. .MYD   # 表数据
    	3. .MYI   # 表索引
       
二、InnoDB
	5.5版本之后默认的存储引擎
    支持事物,行锁,外键等操作,存取速度没有MyISAM快,但是安全性更高
    2个文件后缀:
        1. .frm 表结构
        2. .ibd 表数据(表索引)	
    """
    事物(数据出现问题能回退到出问题之前)
    行锁(操作某一行数据时其他人不能操作)
    外键(数据与数据之间建立关系)""" 
    
三、Memory   # 记忆  it里内存的意思
	基于内存存取数据,用于临时表数据存取。
    " 关闭程序时数据丢失。" 
    1个文件后缀:
        .frm 表结构

四、BlackHole # 黑洞
	 任何写入的数据都会立刻丢失
    1个文件后缀:
    	.frm 表结构       

代码验证

create database db2;  # 建议一个库用于测试
use db2;   # 进入库, MySQL 不分大小写
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;
往表内写入数据
insert into t1 values(1);   # 1
insert into t2 values(1);   # 1
insert into t3 values(1);   # 1 因数据还在内存里,重启mysql 后  0
insert into t4 values(1);   # 0

创建表的完整语法

create table 表名(
	 字段名 字段类型(数字) 约束条件,
    字段名 字段类型(数字) 约束条件,
    字段名 字段类型(数字) 约束条件
 )
注意事项:
	1. 字段名与字段类型必须填写
   	2. 数字与约束条件是可选的
    3. 约束条件可以写多个,空格隔开
    4. 最后一行不能加逗号

数字的含义

数字在很多地方是用来限制存储数据的长度。
整型中数字却不是用来限制存储长度的,是用来控制展示的长度 
"建立 整型字段无需输入数字"
 代码验证:
    create table t1(id int(3));
    insert into t1 values(1234); 
    select * from t1; # 结果是1234 很明显不是限制长度
    create table t2(id int(5) zerofill); 
    # zerofill 可以把不足位数的数字用0填充
    insert into t2 values(123),(1234567);
    select * from t2;
    结果是 00123  , 1234567    

严格模式

我们在使用数据库存取数据时,如果数据不符号规范应该直接报错,而不是直接修改数据,这样会导致数据失真.
	严格模式就是用来不符合规范直接报错
  1.修改配置文件
[mysqld]
	sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 
  2. 临时修改  
   set session sql_mode='strict_trans_tables';  # 在当前客户端有效
   set global sql_mode='strict_trans_tables';   # 在当前服务端有效    	
    show variables like '%mode%'; 查看当前mysql配置

字段类型

整型

tinyint   1bytes(字节)  正负号占(1bit)
smallint  2bytes      正负号占
int      4bytes      正负号占
bigint    8bytes      正负号占 


	整型是携带正负号的
create table t1(id tinyint);
insert into t1(-129),(128);
	在取消严格模式下测试:
 结果 -128 和127  怎么少了一位呢,被正负号占用了
 	我们也可以取消正负号
create table t1(id tinyint unsigned);
insert into t1 values(-129),(128),(888);
结果 # 0  128  256  

image

浮点型

1. float(60,20)
2. double(60,20)
3. decimal(60,20)
	存储60位数,小数点后20位。
    
进行测试三者有何不同
create table t1(id float(60,20));
create table t2(id double(60,20));
create table t3(id decimal(60,20));
insert into t1 values(1.11111111111111111111);
+------------------------+
| id                     |
+------------------------+
| 1.11111116409301760000 |
+------------------------+
insert into t2 values(1.11111111111111111111);
+------------------------+
| id                     |
+------------------------+
| 1.11111111111111120000 |
+------------------------+
insert into t3 values(1.11111111111111111111);
+------------------------+
| id                     |
+------------------------+
| 1.11111111111111111111 |
+------------------------+

三者的区别在于 数字的精准度不同
 	float	<	double  < 	decimal

image

字符类型

" char" 定长
	char()根据我们在括号内填写的数字最多存储该数字的字符,字符不够则用空格填充。超出报错
    优势:整存整取,速度快
    劣势:浪费存储空间
====================================================================================    
"varchar" 变长
	varchar() 根据我们在括号内填写的数字最多存储该数字的字符 ,不够有几个存几个, 超出报错
	 优势:节省存储空间
    劣势: 存去数据的速度较char 慢
 
varchar 不一样在于存取字符时会在字符前面+上报头。传输的时候先传报头。
====================================================================================
    代码验证:
  create table t1(id int,name char(4));
  create table t2(id int,name varchar(4));
  insert into t1 values(1,'t');
  insert into t2 values(1,'tank')
" 使用select char_length(name) from 表名;" 
查看该字符的长度。

默认情况下MySQL针对char的存储会自动填充空格和删除空格,
使用
set global sql_mode='strict_trans_tables,pad_char_to_full_length';
 更改配置查询填充空格后的字符长度

枚举与集合

枚举 "enum" 多选一
create table t1(
    id int,
    name varchar(32),
    gender enum('male','female'))

insert into t1 values(1,'tank','male');
+------+------+--------+
| id   | name | gender |
+------+------+--------+
|    1 | tank | male   |
+------+------+--------+
insert into t1 values(2,'zyg','sss');
# Data truncated for column 'gender' at row 1 第1行的“性别”列的数据被截断
在我们设定好了多选一的情况下不输入其内部含有的 就会报错
===================================================================================
集合 set 多选多包含多选一
create table t1(
    id int,
    name varchar(32),
    hobbies set('read','Basketball','music'));
 insert into t2 values(1,'tank','read,music');
+------+------+------------+
| id   | name | hobbies    |
+------+------+------------+
|    1 | tank | read,music |
+------+------+------------+

日期类型

datetime  年月日时分秒
date     年月日
time     时分秒
year     年
	可以用在 注册时间,生日啊,学习时间啊,工作年限啊。这些需要使用到时间的字段。
create table t17(
	id int,
  	name varchar(32),
 	register_time datetime,
 	birthday date,
 	study_time time,
 	work_time year
);

 insert into t17 values(1,'tank','2022.9.21,14:00:00','1994.11.11','17:10:00','2011');
+------+------+---------------------+------------+------------+-----------+
| id   | name | register_time       | birthday   | study_time | work_time |
+------+------+---------------------+------------+------------+-----------+
|    1 | tank | 2022-09-21 14:00:00 | 1994-11-11 | 17:10:00   |      2011 |
+------+------+---------------------+------------+------------+-----------+
注意: 要按照时间格式来填写 年月日.  时分秒:
    涉及到日期相关字段一般都是系统自动回去 无需我们自己操作

image

posted @ 2022-11-23 17:15  李阿鸡  阅读(58)  评论(0)    收藏  举报
Title