数据库之数据类型
1.数据存储引擎
 一个功能的核心部分,回到mysql
        核心功能是存储数据  涉及到存储数据的代码 就称之为存储引擎
        根据不同的需求 也有着不同的引擎分类
 不同的引擎测试
      创建表时在最后指定引擎名称  engine = xxx
  create table t1(id int)engine=innodb
  create table t1(id int not null)engine=csv
  create table t1(id int)engine=memory
  create table t1(id int)engine=blackhole
 总结: innodb是默认的引擎 因为 它是永久存储 并且  支持事务,行锁,外键
2.创建表的完整语法
 create table 表名(
  字段名1 类型[(宽度) 约束条件],
  字段名2 类型[(宽度) 约束条件]
  );
 类型:使用限制字段必须以什么样的数据类型传值
 约束条件:约束条件是在类型之外添加一种额外的限制
 # 注意:
  1. 在同一张表中,字段名是不能相同
  2. 宽度和约束条件可选,字段名,表名和类型是必须的
  3、最后一个字段后不加逗号
3.基本数据类型之整型
 1、作用:id号,各种号码,年龄,等级
 2、分类:
 tinyint(**)   1个字节
  create table t1(x tinyint);
  insert into t1 values(128),(-129);
  如果数据超出范围就尽可能保存最大的 例如 在无符号下 保存256  其实存的255
        如果有符号  例如 tinyint  保存-1280 其实存的是-128  是最小值
 int (*****)   4个字节
 bigint(***)   8个字节
 3、测试:默认整型都是有符号的
  create table t4(x int(12) unsigned);  #在后面加上约束unsigned 变成无符号
  修改严格模式:
        超过范围也能添加成功是因为 mysql处于非严格模式
            查看当前模式  show variables like "sql_mode";
            修改为严格模式  set global sql_mode = "STRICT_TRANS_TABLES";
        严格模式下 如果值超出范围就直接报错,在一些版本中默认就是严格模式!
            在我们的正常开发中,我们应该先判断数据的正确性,没有问题在发给数据库
  长度限制对于整型的意义:
            create table t10(id int(1));
            insert into t10 value(454555);
            发现这个数也存储成功,说明 这里长度指的不是存储容量限制,而是显示的宽度
            如果你的数据超过了显示宽度 有几个显示几个
            如果不足 则补全到指定长度  得告诉它用什么来补全
            create table t13(id int(10) zerofill);
    总结:不是容量限制 而是 显示宽度
   要限制显示宽度
    1.创建表时 给整型加上宽度
    2.加上zerofill约束
4.浮点型: 小数型
 1 作用:存储身高、体重、薪资
 2 分类:
  float (*****)   4
  double (**)     8
  decimal (**)   不确定(手动设置)
  给浮点设置宽度限制
  float(m,d)    double(m,d)    decimal(m,d)
   m表示 这个浮点数整体的长度
   d表示 小数部分的长度
   例如: float(5,3)  最大值: 99.999
 3.测试:
  相同点
   1、对于三者来说,都能存放30位小数,
   2. float和double的最大长度为255
  不同点:
   1、精度的排序从低到高:float,double,decimal
   2、float与double类型能存放的整数位比decimal更多
5.字符类型:字符串
 1、作用:姓名,地址,描述类的信息
 2、分类:
  char 定长
   针对char类型,mysql在存储时会将数据用空格补全存放到硬盘中
   但会在读出结果时自动去掉末尾的空格,因为末尾的空格在以下场景中是无用
  varchar 变长
 3、测试:字符的宽度限制单位是字符个数
  create table t12(x char(4)); # 超出4个字符则报错,不够4个字符则用空格补全成4个字符
  create table t13(y varchar(4));# 超出4个字符则报错,不够4个字符那么字符有几个就存几个
  char和varchar 长度都比较小 最大就是65535
 4. 结论:
  select char_length(a),char_length(b) from t18;
  使用一个 char_length的函数 可以查看字符的长度
  设置sql模式来实现查看全部长度(空格不去掉的长度)
  set global sql_mode = "PAD_CHAR_TO_FULL_LENGTH,STRICT_TRANS_TABLES"
  设置完成后重启msyql 再次查询长度
  注意:
  当你在执行这样的查询语句时  mysql会自动将参数末尾的空格去除
  select *from t19 where  name = "yh"
  当你在使用模糊搜索时 要注意 定长字符 后面可能会有空格 所以最好在后面加上百分号 %
  select *from t19 where  name like "yh";
   % 任意个数的任意字符
   _ 1个任意字符
6.日期类型
 1.分类
  time   时分秒   HH:MM:SS   ***
  year   年份     ***
  date   日期  年月日   ***
     datetime 日期加时间 年月日 时分秒     年份最大是9999    *****
     timestamp 时间戳  从1970-1-1开始算    年份最大是2037    *****
 2.总结:datetime和timestamp
  共同点: 时间的存取通过字符串类型
    都可以使用now()函数来插入当前时间
  datetime 和 时间戳都能够表示日期和时间
  不同之处是: 年份最大范围不同
     时间戳可以为空 代表当前时间
     时间戳在你更新记录时 会自动更新为当前时间
 3、测试
  create table student(
   id int,
   born_year year,
   birth date,
   class_time time,
   reg_time datetime);
  insert into student values(1,'2000','2000-01-27','08:30:00','2013-11-11 11:11:11');
7. 集合与枚举类型
 枚举  **
  用于描述 一个已知范围的数据 例如性别: 只有男 女 或其他
  enum("man","woman","other")
  总结: 枚举中只能是字符串类型
     添加的数据只能是已经出现在枚举中的值
     你的值只能是其中的一个
     你也可以使用枚举值的序号来插入值 从1开始
      多选1
 集合 **
  用于描述一堆数据  比如你的兴趣爱好
  set("watch movie","listen music","play game")
  总结:集合中的数据 只能是字符串
    添加的数据只能是已经出现在集合中的值
    你的值可以是其中的任意几个
    你也可以使用枚举值的序号来插入值 从1开始   但是只能给一个序号
    多选多
posted on 2018-09-12 20:26  吴之家  阅读(148)  评论(0编辑  收藏  举报