zoukankan      html  css  js  c++  java
  • mysql之基本数据类型

    • mysql常用数据类型概览
    1. 数字:
        整型:tinyinit  smallint  mediumint  int  bigint
        小数:
            float :在位数比较短的情况下不精准
            double :在位数比较长的情况下不精准
                0.000001230123123123
                存成:0.000001230000
    
            decimal:(如果用小数,则用推荐使用decimal)
                精准
                内部原理是以字符串形式去存
    
    2. 字符串:
        char(10):存取速度快,浪费空间,
            root存成root000000
        varchar:精准,节省空间,存取速度慢
    
        sql优化:创建表时,定长的类型往前放,变长的往后放
                        比如性别           比如地址或描述信息
    
        >255个字符,超了就把文件路径存放到数据库中。
                比如图片,视频等找一个文件服务器,数据库中只存路径或url。
    
    3. 时间类型:
        datetime  date  time year等
    
    4. 枚举类型与集合类型
    	枚举: enum
        集合: set
    

    整型

    • 分类:TINYINT SMALLINT MEDIUMINT INT BIGINT
    • 作用:存储年龄,等级,id,各种号码等

    类型存储范围:参考图片:<>

    验证整型字段有无符号及范围

    create table t1(x tinyint);
    insert into t1 values(128),(-129);
    
    create table t2(x tinyint unsigned);
    insert into t2 values(-1),(256);  
    
    create table t3(x int unsigned);
    insert into t3 values(4294967296);
    

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

    create table t4(x int(8));
    insert into t4 values(4294967296123);
    
    # 显示时,不够8位用0填充,如果超出8位则正常显示
    create table t5(x int(8) unsigned zerofill);
    insert into t5 values(4294967296123);
    
    # create table t6(id int(10) unsigned);
    # create table t7(id int(11));
    

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

    严格模式补充

    我们刚刚在上面设置了char,tinyint,存储数据时超过它们的最大存储长度,发现数据也能正常存储进去,只是mysql帮我们自动截取了最大长度。但在实际情况下,我们应该尽量减少数据库的操作,缓解数据库的压力,让它仅仅只管理数据即可,这样的情况下就需要设置安全模式

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

    浮点型

    • 分类:FLOAT DOUBLE decimal
    • 应用场景:身高,体重,薪资

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

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

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

    字符类型

    • 分类
      • char(定长)
      • varchar(变长)
    • 作用:姓名,地址,描述类信息
    create table t10(name char(4))  # 超出四个字符报错,不够四个字符空格补全
    create table t11(name varchar(4))  # 超出四个字符报错,不够四个有几个就存几个
    
    # 验证存储限制
    insert into t12 values('hello');
    insert into t13 values('hello');
    # 验证存储长度
    insert into t12 values('a'); #'a    '
    insert into t13 values('a'); #'a'
    select * from t12
    select * from t13  # 无法查看真正的结果
    
    select char_length(name) from t12
    select char_length(name) from t13  # 仍然无法查看到真正的结果
    
    """首先应该肯定的是在硬盘上存的绝对是真正的数据,但显示的时候mysql会自动将末尾的空格取掉"""
    # 如果不想让mysql帮你做自动去除末尾空格的操作,需要再添加一个模式
    set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";
    # 退出客户端重新登陆
    select char_length(x) from t12; #4
    select char_length(y) from t13; #1
    
    # 针对char类型,mysql在存储时会将数据用空格补全存放到硬盘中。但是会在读出结果的时候自动取掉末尾的空格
    
    """
    char与varchar的使用区别
    """
    name char(5)
    # 缺点:浪费空间
    # 优点:存取速度都快
    陈二 alex lxx  jxx  txx  
    
    name varchar(5)
    # 缺点:存取速度慢
    # 优点:节省空间
    1bytes+陈二 1bytes+alex 1bytes+lxx  1bytes+jxx  1bytes+txx 
    

    时间类型

    • 分类

      • date:2019-05-01
      • time:11:11:11
      • Datetime: 2019-01-02 11:11:11
      • Year:2019
    • 测试

      create table student(
      	id int,
        name char(16),
        born_year year,
        birth date,
        study_time time,
        reg_time datetime
      );
      insert into student values(1,'陈二','2019','2019-05-09','11:11:00','2019-11-11 11:11:11');
      

    枚举与集合类型

    • 分类

      • 枚举enum 多选一
      • 集合set 多选多
    • 测试

      create table user(
      	id int,
        name char(16),
        gender enum('male','female','others')
      );
      insert into user values(1,'刘大','xxx')  # 报错
      insert into user values(2,'陈二','female')  # 正确!
      
      
      create table teacher(
      	id int,
        name char(16),
        gender enum('male','female','others'),
        hobby set('read','sleep','sanna','dbj')
      );
      insert into teacher values(1,'陈二','male','read,sleep,dbj')  # 集合也可以只存一个
      

  • 相关阅读:
    关于数组的排序和拷贝!
    append和appendTo的区别!
    Layui的一点小理解(上)
    winfrom数据导出
    检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配
    文件监听
    C# winform 启动外部程序
    bat命令复制文件
    3.将模型添加到 ASP.NET Core MVC 应用
    2.将视图添加到 ASP.NET Core MVC 应用
  • 原文地址:https://www.cnblogs.com/penghengshan/p/10875828.html
Copyright © 2011-2022 走看看