数据库2/字符编码/配置文件/字段类型/约束条件

mysql基础2

  • 字符编码与配置文件
  • 存储引擎
  • 创建表的完整语法
  • 字段类型之整型
  • 字段类型之浮点型
  • 字段类型之字符型
  • 数字的含义
  • 字段类型与枚举集合
  • 字段类型之日期类型
  • 字段约束条件

字符编码与配置文件

  • 查看数据库基本信息

\s  # 查看数据库基本信息(用户、字符编码)
------------------------------------------

mysql  Ver 14.14 Distrib 5.6.44, for Win64 (x86_64)

Connection id:          6 
Current database:
Current user:           root@localhost
SSL:                    Not in use
Using delimiter:        ;
Server version:         5.6.44 MySQL Community Server (GPL)
Protocol version:       10
Connection:             localhost via TCP/IP
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    gbk
Conn.  characterset:    gbk
TCP port:               3306
Uptime:                 6 hours 42 min 50 sec

Threads: 1  Questions: 12  Slow queries: 0  Opens: 67  Flush tables: 1  Open tables: 60  Queries per second avg: 0.000
  • 配置文件

  • my-default.ini # windows下MySQL默认的配置文件

  • 拷贝上述文件并且重命名为my.ini

  #字符编码配置
  
  [mysqld]      #服务端配置块
      character-set-server=utf8
      collation-server=utf8_general_ci
      
  [client]  	  #客户端配置块
      default-character-set=utf8
  [mysql]
      default-character-set=utf8 
      
   ---------------------------注意事项--------------------------------
  [mysqld]      #服务端配置块 修改后,数据库服务需要重新起动
  

存储引擎

mysql-官网-存储引擎

事务,XA协议,两段提交

  • 存储引擎列表

查看存储引擎命令

mysql> show engines;
序号 engine/引擎名称 support/支持 Comment/描述 Transactions/事务 XA/一种协议 Savepoints/保存点
1/重要 InnoDB default/默认使用 Supports transactions, row-level locking, and foreign keys
支持事务、行级锁定和外键
YES/支持 YES/支持 YES/支持
2/重要 MyISAM YES MyISAM storage engine no no no
3 BLACKHOLE YES /dev/null storage engine (anything you write to it disappears)/ no no no
4 CSV YES CSV storage engine
5 MEMORY YES Hash based, stored in memory, useful for temporary tables/
基于哈希存储在内存中,对临时表有用
no no no
6 ARCHIVE YES Archive storage engine no no no
7 FEDERATED NO Federated MySQL storage engine NULL NULL NULL
8 PERFORMANCE_SCHEM YES Performance Schema no no no
  • 引擎使用目的

    我们可以简单的理解为存储引擎就是针对相同的数据采用的不同的存取策略
    
  • 掌握引擎【重要】

    InnoDB引擎特点: 
    	1.mysql5.5版本后默认使用
    	2.存取数据的速度没有MyISAM快,安全性高(支持事务,行级锁和外键)
    -------------------------------------------------------------
    
    myISAM引擎:
    	优点:存取数据的速度快
    	缺点:安全性低,功能少(不支持事务,不支持XA协议,不支持savepoint)
    	
    
    -------------------------------------------------------------
    
    memory引擎:
    	1.不支持事务,不支持XA协议,不支持savepoint,
    			基于内存的存储引擎,存取速度极快,断电或者重启操作数据会立刻丢失。
    			
    -------------------------------------------------------------
    balackhole引擎:不支持事务,不支持XA协议,不支持savepoint,写入的数据会丢失,类似于垃圾站
    
  • 引擎表结构

    InnoDB
    	.frm	表结构
     	.ibd	表数据、表索引(加快数据查询)
    ----------------------------------------------
    MyISAM
    	.frm	表结构
     	.MYD	表数据
     	.MYI	表索引(加快数据查询)
    ------------------------------------------------
    Memory
    	.frm	表结构
    ----------------------------------------------------
    BlackHole
    	.frm    表结构
    
  • 重要引擎实战

    ------------创建表并指定引擎---------------------
    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);
    insert into t2 values(1);
    insert into t3 values(1);
    insert into t4 values(1);
    --------------查看插入数据---------------------------------
    mysql> select * from t1,t2,t3;
    +------+------+------+
    | id   | id   | id   |
    +------+------+------+
    |    1 |    1 |    1 |
    +------+------+------+
    mysql> select * from t4;
    Empty set (0.00 sec)
    
  • 额外拓展XA协议,事务,savepoint

    • XA协议

      分布式事务处理

      1.XA协议由Tuxedo首先提出的,并交给X/Open组织,作为资源管理器(数据库)与事务管理器的接口标准
      2.我们常见的数据库连接事务中的 XA 是指由 X/Open 组织提出的分布式事务处理的规范. 
      XA 规范主要定义了事务管理器(Transaction Manager)和局部资源管理器(Local Resource Manager)之间的接口.
      (资源管理器可以理解为我们常用的数据库
       3.使用两阶段提交来完成一个全局事务,XA规范的基础是两阶段提交协议。
      
    • Transactions/事务

      MySQL 事务主要用于处理操作量大,复杂度高的数据。
      
    • savepoint/保存点

      保存点(savepoint)是事务过程中的一个逻辑点,用于取消部分事务,当结束事务时,会自动的删除该事务中所定义的所有保存点。当执行rollback时,通过指定保存点可以回退到指定的点。
      

创建表的完整语法

create table 表名(
	 字段名1 字段类型(数字) 约束条件,
	 字段名2 字段类型(数字) 约束条件,
    字段名3 字段类型(数字) 约束条件
)engine=存储引擎;

--------重要------------------
1.字段名和字段类型是必须的(至少写一个)
2.数字跟约束条件是可选的(可有可无)
3.约束条件可以写多个 空格隔开即可
4.最后一个字段的结尾千万不能加逗号

字段类型之整型

整型名称 大小 范围(无负号) 范围(有负号) 用途
tinyint 1bytes (0,255) -128~127 小整数
smallint 2bytes (0,65 535) (-32 768,32 767) 大整数值
mediumint 3Bytes (0,16 777 215) (-8 388 608,8 388 607) 大整数值
int 4bytes 0,4 294 967 295) (-2 147 483 648,2 147 483 647) 大整数值
bigint 8bytes (0,18 446 744 073 709 551 615) (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) 极大整数值
  • 验证整型负号

    -----------插入-129 256 -------------------------------
    create table t6(id tinyint);
    insert into t6 values(-129),(256);
    mysql> select * from t6;
    +------+
    | id   |
    +------+
    | -128 |
    |  127 |
    +------+
    2 rows in set (0.00 sec)
    -------------总结----------------
    自动填充边界值,数据失真,没有实现实际意义
    上述所有的整型类型默认都会带有负号
    
  • 自助移除负号

    #例子
    create table t8(id tinyint unsigned);   #unsigned 约束条件,移除负号。
    insert into t8 values(-129),(256);
    
    mysql> select * from t8;
    +------+
    | id   |
    +------+
    |    0 |
    |  255 |
    +------+
    2 rows in set (0.00 sec)
    
  • 整数规范插入操作

    插入的数据超过了数据类型的范围,不应该让其插入并自动修改,没有意义
    数据库应该直接报错(这个特性是有的)

  • 方式1:命令临时修改

    set session sql_mode='strict_trans_tables'  当前客户端操作界面有效
    set global sql_mode='STRICT_TRANS_TABLES'  服务端不重启永久有效
    
  • 方式二配置文件修改

    [mysqld]
    sql_mode='STRICT_TRANS_TABLES'
    

字段类型之浮点型

浮点型 精度
float 单精度
double 双精度
decimal 十进制小数型

验证精确度问题

  --------------例子-----------------------------
  create table t10(id float(255,30));
  create table t11(id double(255,30));
  create table t12(id decimal(65,30));
  insert into t10 values(1.11111111111111111111111111111);
  insert into t11 values(1.11111111111111111111111111111);
  insert into t12 values(1.11111111111111111111111111111);
  
  --------验证结果-----------
  mysql> select * from t10,t11,t12 \G;
  *************************** 1. row ***************************
  id: 1.111111164093017600000000000000
  id: 1.111111111111111200000000000000
  id: 1.111111111111111111111111111110
  1 row in set (0.00 sec)
  
  
  --------总结------------
  精确度
  float < double < decimal
  一般情况下float足够使用,如果追求非常完美的精确度,可以用字符串代替

字符串类型之字符类型

字符类型 优点 缺点
char 定长 整存整取 速度快 浪费存储空间
varchar 变长 节省存储空间 存取数据的速度慢于char
  char(4)  
      最大只能存储四个字符 如果超过范围则直接报错
      如果不超出范围 则用空格填充至四个字符
  
  -------------------------------------------
  varchar(4)
      最大只能存储四个字符 如果超过范围则直接报错
      如f果不超出范围 则有几位就存几位
        
        
-----------验证两者区别------------------
create table t15(id int, name char(4));
create table t16(id int, name varchar(4));


mysql> insert into t15 value (1,'jason');
ERROR 1406 (22001): Data too long for column 'name' at row 1
    
mysql> insert into t15 value (1,'jaso');       #char必须插入四个字符
Query OK, 1 row affected (0.00 sec)

------------结果------------------------------
1.结果验证 超出范围两者都会报错
  • 2.验证定长和变长特性

    2.验证定长和变长特性
    	char_length()  # 统计字段数据的长度
    """
    默认情况下char在存储的时候针对没有满足固定位数的字符会自动填充空格
    然后在读取的时候又会自动将填充的空格移除 如果想取消该机制 需要sql_mode
    	set global sql_mode='strict_trans_tables,pad_char_to_full_length';
    上述目录是替换 不是新增 所以之前的配置也要写上
    """
    3.char VS varchar
    	char
        	整存整取 速度快
      		浪费存储空间
      	varchar
        	节省存储空间
           存取数据的速度慢于char
     	"""
     	char(4)
     		a   son jacktom lili
     	varchar(4)
     		1bytes+a1bytes+son1bytes+jack1bytes+tom1bytes+lili
     		存取数据都需要操作报头(耗时)
     	
     	存储人的姓名>>>:varchar
     	"""
    	两者使用频率都很高 现在默认很多时候是varchar
    

数字含义

数字大部分情况下都是用来限制字段的存储长度 但是整型除外!!!
	不是用来限制存储的长度 而是展示的长度

create table t13(id int(3)); 
create table t14(id int(3) zerofill);

总结
	以后涉及到整型字段的定义 类型后面不需要加括号写数字 除非有业务需求必须固定位数
    eg:
    	00000000013
    	00123123031

字段类型之枚举与集合

枚举
	多选一
    	eg:性别(男 女 其他)

create table t15(
	id int,
 	name varchar(32),
	gender enum('male','female','others')
);
集合
	多选多(包含多选一)
    	eg:爱好(唱 跳 rap)
create table t16(
	id int,
	name varchar(32),
	hobbies set('read','run','music','rap')
);

字段类型之日期类型

日期类型 表示
date 年月日
datetime 年月日时分秒
time 时分秒
year 年份
create table t17(
	id int,
	name varchar(32),
 	birth date,
  	reg_time datetime,
 	study_time time,
 	join_time year
);
insert into t17 values(1,'jason','2022-11-11','2000-11-11 11:11:11','11:11:11','1995');

mysql> select * from t17;
+------+-------+------------+---------------------+------------+-----------+
| id   | name  | birth      | reg_time            | study_time | join_time |
+------+-------+------------+---------------------+------------+-----------+
|    1 | jason | 2022-11-11 | 2000-11-11 11:11:11 | 11:11:11   |      1995 |
+------+-------+------------+---------------------+------------+-----------+
1 row in set (0.00 sec)

字段约束条件

insert into 表名 vlaues()  # 默认按照创建表的字段顺序添加
insert into 表名(字段) vlaues()  # 可以自定义字段顺序
=====================================================================================
1.unsigned	无负号
	id int unsigned
2.zerofill	零填充
	id int zerofill
3.not null	非空
	name varchar(32) not null
4.default 	默认值
	name varchar(32) default 'jason'
5.unique	唯一值
	id int unique   单列唯一
 	
 	host varchar(32)
 	port int		
	unique(host,port)  联合唯一
posted @ 2022-08-15 20:22  名字长的像一只老山羊  阅读(75)  评论(0编辑  收藏  举报