zoukankan      html  css  js  c++  java
  • MySQL 数据类型

    MySQL存储引擎

    Innodb : 默认的存储引擎,查询速度相对myisam慢,但是更安全 特点是支持行锁,支持外键

    myisam : 老版本的存储引擎

    memory : 内存引擎,数据全部存在内存中,断电数据消失

    blackhole : 黑洞引擎,无论存什么数据,立马消失

    查看存储引擎 show engines;

    创建对饮存储引擎的表

    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;

     

    表操作

    基本数据类型与约束条件

    创建表的完整语法

    # 语法:
    create table 表名(
        字段1 类型(宽度) 约束条件,
        字段2 类型(宽度) 约束条件,
        字段3 类型(宽度) 约束条件,
        );
    # 注意:
    1.同一表中,字段名不能相同
    2.字段名和字段类型必须有,宽度和约束条件可以没有
    3.最后一个字段后不能加逗号
    # 补充:
    # 1.宽度是对存储数据的限制
    例:
        create table userinfo(name char);  # char默认宽度是1,存储一个字符
        insert into userinfo values('xiaoming');  # 存储 x 或 报错
    ```
    1.没有安全模式的数据版本,能存储数据,但只能存储一个字符x,mysql自动截取一个字符,消耗资源.
    2.有安全模式的版本直接报错:Data too long for column 'name' at row 1
    ```
    # 2.初始约束条件 >>> null 与 not null
    例:
        create table record(id int,name char not null);
        insert into record values(1,'x');  # 正常存储
        insert into record values(1,null);  # 报错
    # 总结:
    # 类型:限制字段必须以什么样的数据类型存储
    # 约束条件: 是类型之外添加额外的限制

    严格模式

    普通模式下存储数据时若超过了他们的最大宽度,数据也能正常存储,那是因为mysql帮我们自动截取了最大长度,但在实际情况下,我们应该尽量减少数据库的操作,缓解数据库的压力,让它仅仅只能管理数据即可,所以苏姚设置安全模式(严格模式)

    show variables like "%mode%";  # 查看数据可配置中变量名包含mode的配置参数(模糊匹配)
    # 修改安全模式
    set session  # 只在当前操作界面有效
    set global  # 全局有效
    ​
    set global sql_mode = 'STRICT_TRANS_TABLES'
    # 修改完之后退出当前客户端重新登录即可

     

    数据类型

    整形

    • 分类 : TINYINT SMALLINT MEDIUMINT INT BIGINT

    • 作用 : 存储 id,年龄,号码等

    存储范围

     

     

     

    验证整形字段有无正负符号及范围

    # unsigned 有符号转无符号
    create table t5(id tinyint);
    insert into t5 values(128),(-129);  # 安全模式(严格模式)下报错,否则按范围存储为127 / -128
    create table t6(id tinyint unsigned);
    insert into t6 values(-1),(256);
    # 补充:
    其他整形也是如此,只是范围不同

    疑问: 类型后面的宽度能否改变字段存储的大小限制

    create table t7(id int(8));  
    insert into t7 values(1234567890);  # 超出8位正常存储
    insert into t7 values(123):  # 少于8位用空格补充
    # unsigned zerofill  显式时,不够8位改为用0补充,如果超8位正常显式
    create table t8(id int(8) unsigned zerofill);
    insert into t8 values(1234567890);
    insert into t8 values(1);


    # 强调:

    对于整型来说,数据类型后的宽度并不是存储限制,而是显式限制,所以在创建表时,如果字段采用的是整型类型,完全无需指定显式宽度,默认的显式宽度足够显式完整当初存放的数据

    浮点型

    • 分类 : float double decimal

    • 应用场景 : 身高,体重,薪资

    字段限制特点 如(5,3) 前一位表示所有的位数,后一位表示小数个数

    三者最大整数位和小数位对比:

    # 存储限制
    float(255,30)
    double(255,30)
    decimal(65,30)
    ​
    # 精确度验证
    create table t9(id float(255,30));
    create table t10(id double(255,30));
    create table t11(id decimal(65,30));
    insert into t9 values(1.111111111111111111111111111111);
    insert into t10 values(1.111111111111111111111111111111);
    insert into t11 values(1.111111111111111111111111111111);
    # 总结:
    # 精度:float < double < decimal

    字符类型

    • 分类

      • char(定长)

      • varchar(变长)

    • 作用: 姓名,地址,描述类信息

    create table t12(name char(4));  # 宽度为4字符,超出报错,不够用空格补充
    create table t13(name varchar(4));  # 宽度为4字符.超出报错,不够是多少字符存多少个字符
    insert into t12 values('x');  # 正常存储,用空格部位,在硬盘中占4个字符位
    insert into t13 values('y');  # 正常存储,在硬盘中只占一个字符位
    '''
    针对char类型,首先肯定的是在硬盘上存的绝对是真是数据,但显式的时候mysql会自动将首末尾的空格去掉
    '''
    # 如果不想mysql帮你自动去除收尾的空格,需要添加一个模式
    set global sql_mode='PAD_CHAR_TO_FULL_LENGTH';
    # 退出客户端重新登录
    select char_length('x') from t12;
    select char_length('y') from t13;
    ​
    # 总结:
    char
    # 特点:存入的字符宽度若不够,用空格补位,在硬盘中存的是空格加字符
    # 缺点:浪费空间
    # 优点:存取速度快
    'xiao' ' wxx' ' lxx'
    carchar
    # 特点:存入的字符宽度若不够,是几个字符存几个字符,但会在字符前加一个bytes标记字符,类似报头
    # 缺点:存取速度慢
    # 优点:节省空间
    '1bytes+xiao' '1bytes+wxx' '1bytes+lxx'

    时间类型

    分类

    • date : 年-月-日

    • time : 时:分:秒

    • datetime: 年-月-日 时:分:秒

    • Year : 年

    create table t14(
        id int,
        name char(16),
        Year year,
        Date date,
        Time time,
        DateTime datetime
    )
    insert into t14 values(1,'xiaoming','2019','2019-08-19','08:01:00','2019-08-19 08:01:00');

    枚举与集合类型

    分类

    • 枚举enum 多选一

    • 集合 set 多选多

    # 枚举 enum
    create table t15(
        id int,
        name char(16),
        gender enum('male','female','others')
    )
    insert into t15 values(1,'xiaoming','xxx');  # 报错
    insert into t16 values(1,'xiaoming','male'); # 正确
    # 集合 set
    create table t16(
        id int,
        name char(16),
        gender enum('male','female','other'),
        hobby set('read','sleep','playgame','dbj')
    );
    insert into t16 values(1,'hanmm','female','read,sleep,dbj');

    约束条件

    '''
    primary key     (pk)    标识该字段为该表的主键,可以唯一标识记录
    foreign key     (fk)    标识该字段为该表的外键
    not null                标识该字段不能为空
    unique key      (uk)    标识该字段值得唯一性
    auto_increment          标识该字段的值自动增长(整数增长,且为主键)
    default                 为该字段设置默认值
    unsigned                无符号
    zerofill                使用0填充
    '''

    not null + default

    # not null
    create table t17(
        id int,
        name char(16)
    );
    insert into t17 values(1,null);
    # 将name字段约束条件改为 not null
    alter table t17 modify name char(16) not null;
    insert into t17 values(2,null);  # 报错
    insert into t17(name,id) values('xiaoming',2);  # 插入数据时,可以指定字段插入
    # default
    create table t18(
        id int,
        name char(16) default 'xiaoming'
        gender enum('male','female','other') default 'male'
    );
    insert into t18(id) values(1);  # 当使用默认值时语法
    insert into t18(id,name) values(2,'lilei');

    unique

    # 单例唯一  限制某一个字段的唯一性
    create table t19(
        id int unique,
        name char(16)
    );
    insert into t19 values(1,'lilei'),(1,'xiaoming');
    insert into t19 values(1,'lilei'),(2,'xiaoming');
    # 联合唯一  在语句最后,用括号形式表示那几个字段组合的结果是唯一的
    create table t20(
        id int,
        ip char(16),
        port int,
        unique(ip,port)
    );
    insert into t20 values(1,'127.0.0.1',8080),(2,'127.0.0.1',8080); # 报错
    insert into t20 values(1,'127.0.0.1',8080),(1,'127.0.0.1',8081);


    primary key + auto_increment

    # primary key
    # 单从约束的角度来说 primary key 等价于 not null + nuique
    create table t21(id int primary key);
    desc t21;
    insert into t21 values(1),(null);  # 报错 不能为空
    insert into t21 values(1),(1);  # 报错 单列唯一
    insert into t21 values(1),(2);

     
    # 除了约束条件外,主键还是innodb引擎组织数据的依据,提升查找效率(类似书的目录)
    '''
    强调:
    1.一张表中有且只有一个主键,如果你没有设置主键,那么会从上到下搜索,直到遇到一个非空且唯一的字段自动将其设置为主键
    '''
    create table t22(
        id int,
        name char(16),
        age int not null unique,
        addr char(16) not null unique
    )engine=innodb;
    desc t22;
    '''
    2.如果表里面没有指定任何的可以设置为主键的字段,那么innodb会采用自己默认的一个隐藏的字段作为主键,隐藏意味着你才查询的时候无法根据这个主键字段加速查询
    3.一张表中通常应该有一个id字段,并将id字段作为主键
    '''



    # 联合主键:多个字段联合起来作为表的一个主键,本质还是一个主键
    create table t23(
        ip char(16),
        port int,
        primary key(ip,port)
    );
    desc t23;
    ​
    # auto_increment 自动递增
    # 主键id作为数据标号,每次最好能自动增加
    create table t24(
        id int primary key auto_increment,
        name varchar(16)
    );
    insert into t24(name) values('x'),('y'),('z');

     

    补充

    delete from 表名;
    该命令确实可以将表中的所有记录删掉,但不不会将id重置为0,所以该命令根本不是用来清空表的,delete是用来删除表中的某一条记录的
    如: delete from 表名 where id > 10;
    truncate 表名;
    该命令将整张表初始化,id重新从0开始记录

     

  • 相关阅读:
    转载:[Oracle]杀死正在执行的sql语句
    转载:记录一次MySQL两千万数据的大表优化解决过程
    转载:logback日志详解
    转载:MySQL千万级大表优化攻略
    使用dbUnit的 IDataSet 因乱序造成assert失败而采取的措施
    解锁用户scott并授权
    两表连接各种Join图示,SQL及查询结果
    一句Delete..In.. 删除语句的优化
    大数据技术之_08_Hive学习_02_DDL数据定义(创建/查询/修改/删除数据库+创建表+分区表+修改表+删除表)+DML数据操作(数据导入+数据导出+清除表中数据)
    大数据技术之_08_Hive学习_01_Hive入门+Hive安装、配置和使用+Hive数据类型
  • 原文地址:https://www.cnblogs.com/waller/p/11379843.html
Copyright © 2011-2022 走看看