MySQL数据库 数据库的引擎,模式,数据类型(更新中...)

数据库的引擎:驱动数据的方式-数据库优化

  • 前提:引擎是建表的时候规定的,提供给表使用的,不是数据库
mysql> show engines #展示所有引擎

#几种比较常见的引擎
   # innodb(默认) :支持事物,行级锁,外键
       mysql>: create table test(id int)engine=innodb
   # myisam: 查询效率要优于innodb,当不需要支持事务,行级锁,外键,可以通过myisam来优化数据库
       mysql>: create table test(id int)engine=myisam
   # blockhole 黑洞,存进去的数据都会消失(可以理解为不存数据)
       mysql>: create table test(id int)engine=blockhole
   #memory 表结构是存储在硬盘上的,但是表数据全部存储在内存中
       mysql>: create table test(id int)engine=memory

数据库的模式

# -mysql 5.7 以后默认都是安全模式
# 5.6版本
sql_model = no_engine_subsitution  #非安全性   默认
sql_model = strict_trans_tables  #安全性

#查看当前数据库模式
    mysql>: show variables like "%sql_mode%"; #%匹配0-n个字符 =>模糊查询

#临时设置为安全模式,服务重启后会被重置
    mysql>: set global sql_model="strict_trans_tables"; #在root用户登录状态下
    #在设置后,重新连接数据库(服务器不重启)就会进入安全模式

#安全模式下,非安全模式sql执行的警告语句,都会抛异常

mysql支持的数据类型

  • 整形

    • """ 整形类型
          tinyint : 1字节,取值范围 -128-127,默认长度4
          smallint: 2字节,取值范围 -32768-32768,默认长度6
          mediumint:3字节
          int: 4字节 -2147483648~2147483647
          bigint: 8字节
      """
      
      """整形约束
          usigned:无符号
          zerofill:用0填充
      """
      # 例:
          create table test(
          id int,
          x tinyint usigned,
          y samllint zerofill,
          w mediumint,
          z bignit);
      
      
  • 浮点型
    • #在安全模式下测试浮点类型
      
      '''类型
      float(m,d): 4字节 范围:3.4E–38~3.4E+38
      double(m,d): 8字节 范围:1.7E–308~1.7E+308
      decimal(m,d): 所在字节m,d值基础上+2,其实就是m值+2就是decimal字段所占字节数
      '''
      
      '''宽度
      #限制存储宽度
          (m,d) => m为位数,d为小数位,m要大于等于d
          float(255,30):精度最低,最常用
          double(255,30):精度高,占位多
          decimal(65,30):字符串存,全精度
       '''
      # 建表:
      mysql>: create table tb4 (age float(256, 30)); # Display width out of range for column 'age' (max = 255)
      mysql>: create table tb5 (age float(255, 31)); # Too big scale 31 specified for column 'age'. Maximum is 30.
      mysql>: create table tb5 (age float(65, 30)); # 在合理取值范围
      
      mysql>: create table t12 (x float(255, 30));
      mysql>: create table t13 (x double(255, 30));
      mysql>: create table t14 (x decimal(65, 30));
      # 1.111111164093017600000000000000
      mysql>: insert into t12 values(1.11111111111111111119);
      # 1.111111111111111200000000000000
      mysql>: insert into t13 values(1.11111111111111111119);
      # 1.111111111111111111190000000000
      mysql>: insert into t14 values(1.11111111111111111119);
      
      # 重点:长度与小数位分析
      # 报错,总长度M必须大于等于小数位D
      mysql>: create table t14 (x decimal(2, 3));
      
      # 能存储 -0.999 ~ 0.999,超长度的小数位会才有四舍五入,0.9994可以存,就是0.999,0.9995不可以存
      mysql>: create table t14 (x decimal(3, 3));  # 整数位 3 - 3,所以最大为0
      
      # 能存储 -9.999 ~ 9.999,超长度的小数位会才有四舍五入,9.9994可以存,就是9.999,9.9995不可以存
      mysql>: create table t14 (x decimal(4, 3));  # 整数位 4 - 3,所以最大为9
      
      # 能存储 -99.999 ~ 99.999,超长度的小数位会才有四舍五入,99.9994可以存,就是99.999,99.9995不可以存
      mysql>: create table t14 (x decimal(5, 3));  # 整数位 5 - 3,所以最大为99
      
  • 字符串
    • '''类型
      char:定长,永远采用设置的长度存储数据
      varchar:不定长,在设置的长度范围内,变长的存储数据
      '''
      '''宽度
      限制存储宽度
      限制存储宽度
      char(4):存 "a" "ab" "abc" "abcd"都采用4个长度,"abcde" 只能存储前4位(安全模式下报错)
      varchar(4):存 "a" "ab" "abc" "abcd"分别采用1,2,3,4个长度存储,"abcde" 只能存储前4位(安全模式下报错)
      
      char就按定长存储,如果数据长度变化大,通常更占空间,但是存取数据按固定定长操作,效率高
      varchar存储数据时,会先计算要存储数据的长度,动态变长存储数据,所以一般较省空间,但是计算是需要耗时的,所以效率低
      
      varchar计算出的数据长度信息也是需要开辟空间来存储,存储在数据头(数据开始前)中,也需要额外消耗1~2个字节
      所以如果数据都是固定长度,或是小范围波动,char相比就不会更占空间,且效率高
      '''
      
      # 建表:
      mysql>: create table ts1 (s1 char(4), s2 varchar(4));
      mysql>: insert into ts1 values('adcde', 'xyzabc');  # 'adcd', 'xyza'
  • 时间
    • '''类型
      year:yyyy(1901/2155)
      date:yyyy-MM-dd(1000-01-01/9999-12-31)
      time:HH:mm:ss
      datetime:yyyy-MM-dd HH:mm:ss(1000-01-01 00:00:00/9999-12-31 23:59:59)
      timestamp:yyyy-MM-dd HH:mm:ss(1970-01-01 00:00:00/2038-01-19 ??)
      '''
      
      # 建表:
      mysql>: create table td1 (my_year year, my_date date, my_time time);
      mysql>: insert into td1 values(1666, '8888-8-8', '8:8:8');  # 时间需要在取值访问内
      
      mysql>: create table td2 (my_datetime datetime, my_timestamp timestamp);
      mysql>: insert into td2 values('2040-1-1 1:1:1', '2040-1-1 1:1:1');  # 时间需要在取值访问内
      mysql>: insert into td2(my_datetime) values('2040-1-1 1:1:1');  # timestamp不复制会才有系统当前时间
      
      # datetime:8字节,可以为null
      # timestamp:4字节,有默认值CURRENT_TIMESTAMP
  • 枚举与集合
    • # 枚举与集合:为某一个字段提供选项的 - 枚举只能单选(1个),集合可以多选(0-n个)
      
      # 建表
      # enum、set默认值为NULL
      mysql>: create table tc1 (name varchar(20), sex enum('男', '女', '哇塞'), hobbies set('男', '女', '哇塞'));
      mysql>: insert into tc1 values('ruakei', '哇塞哇塞', '未知');  
      
      # enum、set手动设置默认值 '男' 与 '哇塞'
      mysql>: create table tc2 (name varchar(20), sex enum('男', '女', '哇塞') default '男', hobbies set('男', '女', '哇塞') default '哇塞');
      mysql>: insert into tc2 values('ruakei', '哇塞哇塞', '未知');
      mysql>: insert into tc2(name) values('ruakei');
      
      # 对sex、hobbies两个字段赋值错误,系统默认用空字符串填充(非安全模式),安全模式抛异常
      # 如果对出sex、hobbies两个字段外的其他字段进行赋值,这两个字段会才有默认值
      
      # 注:对set类型的字段进行赋值,用一个字符串,字符串内部用,将多个选项隔开,且不能添加空格等其他额外字符
      mysql>: insert into tc2 values('ruakei_1', '女', '男,女,哇塞');  
  • 约束
    • """
      primary key:主键,唯一标识,表都会拥有,设置为默认找第一个 不空 唯一的字段,未标识则创建隐藏字段
      foreign key:外键
      unique:唯一性数据:该条字段的值需要保证唯一,不能重复
      auto_increment:自增,只能加给key的int类型字段,作为辅助修饰,一个表中只能设置一个自增字段
      not null: 不为空 -针对一些字段,如注册时的用户名,出生人的性别等,这些需求下的子弹,不能设置为null.必须要对其赋值
      default: 默认值 -对有默认值意外的字段进行赋值时,有默认的子弹会被默认赋值
      unsigned : 无符号 - 存储的数字从0开始
      zerofill: 0填充 - 存整数时数据长度小于取值长度范围长度,会在数字左方以0填充
      """
      
      # not null 与default限制
      # 不能为空,没有默认值的x,必须赋值
      # y,z在没有赋值的情况下,才有默认值,设置值后,采用默认值
      create table test(x int not null,y int default 0,z int default 0)
      
      # 报错,auto_increment必须设置给 键字段
      mysql>: create table td2 (x int auto_increment);
      # 报错,auto_increment必须设置给 int字段
      mysql>: create table td2 (x char(4) auto_increment);
      # 报错,auto_increment字段最多出现 1次
      mysql>: create table td2 (x int unique auto_increment, y int unique auto_increment);
      
      # 正确,主键和唯一键分析
      # x为主键:没有设置primary key时,第一个 唯一自增键,会自动提升为主键
      mysql>: create table td21 (x int unique auto_increment, y int unique);
      # y为主键:没有设置primary key时,第一个 唯一自增键,会自动提升为主键
      mysql>: create table td22 (x int unique, y int unique auto_increment);
      # x为主键:设置了主键就是设置的,主键没设置自增,那自增是可以设置在唯一键上的
      mysql>: create table td23 (x int primary key, y int unique auto_increment);
      # x为主键:设置了主键就是设置的,主键设置了自增,自增字段只能有一个,所以唯一键不能再设置自增了
      mysql>: create table td24 (x int primary key auto_increment, y int unique);
      # 默认主键:没有设置主键,也没有 唯一自增键,那系统会默认添加一个 隐式主键(不可见)
      mysql>: create table td25 (x int unique, y int unique);
      
      # 唯一键:确保一个字段,数据不能重复
      # 主键:是一条记录的唯一标识(可以理解为数据的编号)
      
      # 联合唯一
      # ip在port不同时,可以相同,ip不同时port也可以相同,均合法
      # ip和port都相同时,就是重复数据,不合法
      mysql>: create table tu1 (ip char(16), port int, unique(ip, port));
      
      # 也可以设置成 联合主键,道理同 联合唯一
      mysql>: create table tu2 (ip char(16), port int, primary key(ip, port));
      # sql可以多行书写
      mysql>:
      create table t22(
          ip char(16),
          port int,
          primary key(ip,port)
      );
      
      # 通常自增字段的 自增索引 会被永久记录,想清空表并清空自增索引:
      mysql>: truncate 数据库名.表名

原文地址:https://www.cnblogs.com/kuck/p/11595892.html

时间: 2024-10-15 15:49:46

MySQL数据库 数据库的引擎,模式,数据类型(更新中...)的相关文章

mysql数据库存储的引擎和数据类型

一.查看支持的存储引擎 SHOW ENGINES \G; 或者 SHOW VARIABLES LIKE 'have%'; 二.安装版mysql的默认引擎是InnoDB,免安装版默认引擎是MyISAM 三.查询默认存储引擎 SHOW VARIABLES LIKE 'storage_engine%'; 四.修改默认存储引擎 1.通过向导 2.修改my.ini配置文件 五.选择存储引擎 1.Myisam是Mysql的默认存储引擎.当create创建新表时,未指定新表的存储引擎时,默认使用Myisam.

基于现有数据库的Code First模式迁移更新数据库

本文讨论的内容是基于EF4.1版本.文中谈论的现有的数据库不是由EF创建.本文假定你已经对Code First迁移有一定的了解,如果不了解Code First迁移更新数据库可以查看 文章涉及的主题如下: 1.创建模型 2.可迁移性 3.添加一个初始迁移 a.使用现有的schema作为起点 b.以一个空数据库作为起点 4.注意点: a.默认的/计算的名称可能与现有schema不匹配 b.不是所有的数据库对象都在model中表现出来 一.创建模型 第一步是创建一个以现有数据库为目标的Code Fir

Oracle 9i & 10g编程艺术-深入数据库体系结构-学习笔记(持续更新中)

--20170322 --1.0 --更新表的统计信息begin dbms_stats.set_table_stats(user,'EMP',numrows => 10000);end; begin dbms_stats.set_table_stats(user,'DEPT',numrows => 10000);end; --重新查看表的统计信息select t.table_name,t.num_rows,t.blocks from user_tables t where t.table_na

MYSQL操作的一些知识点,持续更新中····

基本概念——库 1.数据库服务器:库——>表——>行/列 2.cmd下链接: mysql – uroot –proot 3.创建库:create database  php; 3.看数据库下有哪些库: show databases; 4.选中某个库:use php;5.删除某个库:drop database test; 基本概念——表 6.显示某个库的表格:show tables; 7.mysql本身并没有提供修改数据库名字的语句,但可以曲径修改 8.创建一个表:create table cl

MySQL数据库InnoDB存储引擎中的锁机制

MySQL数据库InnoDB存储引擎中的锁机制    http://www.uml.org.cn/sjjm/201205302.asp   00 – 基本概念 当并发事务同时访问一个资源的时候,有可能导致数据不一致.因此需要一种致机制来将访问顺序化. 锁就是其中的一种机制.我们用商场的试衣间来做一个比喻.试衣间供许多消费者使用.因此可能有多个消费者同时要试衣服.为了避免冲突,试衣间的门上装了锁.试衣服的人在里边锁住,其他人就不能从外边打开了.只有里边的人开门出来,外边的人才能进去. - 锁的基本

MySQL常见数据库引擎及对比

一:MySQL存储引擎简介 MySQL有多种存储引擎,每种存储引擎有各自的优缺点,大家可以择优选择使用:MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB(BerkeleyDB).EXAMPLE.FEDERATED.ARCHIVE.CSV.BLACKHOLE. MySQL支持数个存储引擎作为对不同表的类型的处理器.MySQL存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎:  MyISAM管理非事务表.它提供高速存储和检索,以及全文搜索能力.MyISAM在所有MyS

MySQL的数据库引擎的类型(转)

腾讯后台开发电话面试问到数据库引擎选用的问题,这里补习一下. 本文属于转载,原文链接为:http://www.cnblogs.com/xulb597/archive/2012/05/25/2518118.html 你能用的数据库引擎取决于mysql在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译MYSQL.在缺省情况 下,MYSQL支持三个引擎:ISAM.MYISAM和HEAP.另外两种类型INNODB和BERKLEY(BDB),也常常可以使用. ISAM ISAM是一个定义明确且

MySQL数据库InnoDB存储引擎多版本控制(MVCC)实现原理分析

文/何登成 导读:   来自网易研究院的MySQL内核技术研究人何登成,把MySQL数据库InnoDB存储引擎的多版本控制(简称:MVCC)实现原理,做了深入的研究与详细的文字图表分析,方便大家理解InnoDB存储引擎实现的多版本控制技术(简称:MVCC). 基本知识 假设对于多版本控制(MVCC)的基础知识,有所了解.MySQL数据库InnoDB存储引擎为了实现多版本的一致性读,采用的是基于回滚段的协议. 行结构 MySQL数据库InnoDB存储引擎表数据的组织方式为主键聚簇索引.由于采用索引

19 MySQL概念 数据库 数据表 数据类型 增加删除修改查询 WHERE Order By Limit

数据库管理系统DBMS 数据库中相关概念 数据库 数据表 记录 字段 数据 登录和退出MySQL客户端 查询自己的MySQL服务器有几个数据库 二.退出MySQL客户端的命令 修改root用户的密码 在MySQL客户端来修改密码(当前账号的密码) 数据库操作 创建数据库 显示所有数据库 删除数据库 选择数据库 更改数据库默认字符集 数据表操作 显示当前数据库中的所有表 创建数据表 显示表的创建 列的常用属性 修改数据表 删除数据表 显示表结构 MySQL数据类型 整型 浮点型 字符型 文本型 日