• 数据库 数据类型


    存储引擎
    引擎指的事一个系统的核心部分
    引擎有不同分类是为了适应不同的使用场景
    查看mysql支持所有引擎
    show engines;
    MRG_MYISAM 是一堆MYISAM表的集合
    用于做水平分表,如果一个表中数据太大将导致效率降低
    水平分表就是把整个大表拆成不同的小表,每次查询会判断数据在哪一个表中 然后对应去查询以此来提高效率
    name age sex
    jerry 40 woman
    垂直分表
    name age sex phone addr gf bf idcard number
    jerry 40 woman 110 上海 xx xx 身份证 学号
    当一个表中字段太多 然而常用的信息就那么一两个 那就可以把不常用字段 切到另一个表中然后建立关联关系
    innodb 是最常见的引擎 因为支持 事物 行锁 外键一系列功能
    MyISAM没有上述一堆功能 但是 存储效率比innodb要高 并且支持分表
    MEMORY 速度快 不能永久储存 没有特别的功能

    1.详细的建表语句
    []表示可选
    create table 名称(字段 类型[(宽度) 约束条件,字段 类型...])
    2.数据类型
    为什么要给数据分类?
    1.不同的数据类型 描述信息可以更加方便准确
    2.在计算机中对数据分类可以减少内存开销
    1.数字
    整型 默认都是有符号的
    tinyint 1个字节 8个二进制 0-255 -128到127
    smallint 2个字节
    mediumint3个字节
    bigint8个字节
    设置为无符号 需要在类型后添加unsigned
    create table 表名(a tinyint unsigned);
    宽度在整型数据中 不是用来设置可存储的数据范围的
    用于控制最小显示长度(字符数)如果长度不足 就帮ini补0 但是需要指定zerofill
    create table 表名(a tinyint(5) zerofill);
    结论是;使用整型数据 宽度整个属性一般不用管他
    浮点
    float 4个字节
    float(a,b)
    double 8个字节
    double(a,b)
    decimal 不固定
    decimal(a,b)
    a代表总位数 b表示小数位数
    共同点 :小数位最大为30
    float与double总长最大为255
    都是不精确的 double比float精确点
    不同点:
    decimal总长最大为65 并且是精确的
    2.字符串
    char固定长度 和 varchar可变长度
    char(L)varchar(L)
    L都是表示最大可存储的长度 不是字节
    a char(4) b varchar(4)
    a:S 最终还是占4个字符长度
    b:S 最终占1个字符长度+标识信息的长度(1-2字节)
    如果有三个数据要存 每一个数据都是一个s字符 最终3*4=12个字符长度
    占用空间较多 存取速度较快
    varchar 存储时必须保存一个长度标识信息 所以所占空间为实际内容长度+标识信息长度
    相比较 char空间省了 但是效率降低了
    char采取的空间换时间 提高效率
    字符串型的BUG 由于char类型是定长 mysql会在末尾填充空客来达到定长效果
    所以char类型 不能存储末尾带有空格的数据 会直接把空格给丢了
    固定长度的字符串类型 不常用
    tinytext 1字符
    text 2字符
    mediumtext 3字符
    longtext 4字符
    二进制数据类型 单位都是字节
    binary varbinary
    binary是固定长度的二进制
    varbinary 可变长度的二进制
    长度固定无法修改的二进制
    tinyblob
    blob
    mediumblob
    longblob
    强调:
    二进制数据类型一般不用如果要存储媒体 如音频视频
    需要将其放到FTP文件服务器上 然后数据库中只存储连接即可
    时间类型
    year 4位年份
    date 日期 yyyy-MM-DD
    time 时间 HH:mm:SS
    datetime yyyy-MM-DD HH:mm:SS
    timestamp 时间戳 一个浮点类型 从unix元年到现在的秒数

    year 可以是数字 也可以是字符串
    可以用四位字符串 也可以2位字符 或数字
    00-69==2001-2069
    70-99==1970-1999
    timestamp 会自动更新时间 当你插入时或修改时
    current_time 和now()所有的时间 日期类型都可以使用这两个方法来输入当前时间
    所有的日期时间数据库返回的都是字符串类型
    严格模式
    5.7以下的版本 默认是非严格模式的 例如你的类型为tinyint 存储的是128 最终存储的是127
    set global sql_mode = "strict_trans_tables"可以将其设置为严格模式
    最好写到配置文件中 永久有效
    enum 前提规定该字段选的值的范围 多选1
    set提前规定该字段能选的值的范围 区别是 set 字段有多个值 用逗号隔开 多选多
    数据库范式
    就是指导你该如何设计数据库

    数据类型 整型int 浮点float double decimal 字符串 char varchar 时间-日期 枚举-集合 二进制
    在保证数据足够保存情况下 选用占用空间最小的类型

    3.约束
    完整的建表语句
    create table 名称(字段 类型[(宽度)约束条件],字段 类型,...)
    约束指的给数据的值加上一些限制
    类型就是一种限制 宽度对于整型数据 没有存储限制 其他类型的宽度是有限制作用的
    约束就是除了 数据类型以及宽度之外的其他限制
    unsigned就是约束中第一种 表示你的整数 不能包含字符号 仅针对数字类型
    约束 是为了保证数据的完整性
    完整性约束
    not null 非空
    限制该字段 必须有值
    例如账户密码
    default 默认值
    例如 多数用户都是男的 游戏账号的金币可以默认
    1.建表直接指定
    create table 表名(name char(10) not null default 默认值);
    后期增加约束
    alter table 表名 modify name char(10) not null default 已有的字段
    alter table 表名 add sex char(10) not null default 新增字段
    unique 唯一性约束 并且是一个索引
    要求该字段的值 不能重复
    单字段:
    create table 表名(name char(20) unique,school char(10));
    多字段联合唯一约束:
    create table 表名(name char(20),school char(10),unique(name,school));
    例如:名字和校区两个字段 如果两个校区有相同的姓名 这时候就可以把这两个字段作为联合唯一索引
    这些字段都相同才算重复
    primary key 主键约束
    从约束角度看 空 和 非空 + 唯一 是相同的效果
    不能为空且不能重复
    需要强调的是:
    主键有约束的效果 还是一个索引 并且是非常重要的索引
    在该innodb 主键是必不可少的
    innodb 组织数据结构是按照树形结构来组织的,该结构中 必须有一个数据 不能为空且唯一的
    如果没有这样的数据 树形结构也就不存在
    mysql在创建表的时候 会检测 是否存在主键
    如果没有 它就找一个具有非空且唯一约束的字段提升为主键
    如果也没有这样的字段 mysql就创建一个隐藏字段作为主键
    索引 可以提高查询速度
    结论就是:只要你是用innodb引擎 你就应该建表时设置一个主键 通常主键字段叫做id
    id有唯一标识的意思
    索引 就像时 字典里的目录 用于快速定位数据所在位置
    自动增长
    主键在使用中 需要我们自己来维护其正确性 你需要知道上一次写的是什么 然后找一个之前没用过的主键
    mysql提高了自动增长约束 可以帮你自动管理主键的值
    要求必须是整型,每次插入数据都会自动+1 程序中就不要再自己管理主键了
    语法:
    create table 表名(id int primary key auto_increment,name char(10))
    插入带有自动增长的字段时 可以直接忽略该字段也可以插入一个null
    insert into 表名 values(null,'jack');
    insert into 表名(name) values('jack');
    只要你创建一个表 就应该有主键 并且自动增长
  • 相关阅读:
    写了一个Windows服务,通过C#模拟网站用户登录并爬取BUG列表查询有没有新的BUG,并提醒我
    WCF快速上手(二)
    Oracle递归查询
    100多行代码实现6秒完成50万条多线程并发日志文件写入
    C#写日志工具类
    WPF定时刷新UI界面
    HttpUtil工具类
    WPF GridView的列宽度设置为按比例分配
    Visifire图表
    C# BackgroundWorker 的使用、封装
  • 原文地址:https://www.cnblogs.com/ShenJunHui6/p/10532730.html
Copyright © 2020-2023  润新知