zoukankan      html  css  js  c++  java
  • MySQL数据类型(重要)

    一、数据类型(重要)

    mysql数据库支持以下数据类型:

    • 整型 | 浮点型 | 字符型 | 时间类型 | 枚举类型 | 集合类型

    整型

    重点:tinyint、int、约束(unsigned、zerofill)

    类型

    tinyint1字节 -128~127 (适用于逻辑判断)*重点
    smallint2字节 -32768~32767
    mediumint3字节
    int4字节 -2147483648~2147483647 (int长度11位,如果超过长度就用字符串) 重点
    bigint
    8字节*

    约束(重点掌握*)

    unsigned无符号
    zerofill0填充

    # 建表
    mysql>: create table tb1(x tinyint, y smallint, z int(6));
    
    # 插入数据(在安全模式下直接报错)
    mysql>: insert into tb1 values(128, 32768, 32768);  # 结果:127,32767,32768
    
    
    # 结论:整型的长度由所占字节(取值范围)决定,可以自定义长度,但是不影响所占字节(取值范围)
    # 	 所有整型变量的长度一般都省略不写
    
    '''宽度
    1.不能决定整型存放数据的宽度, 超过宽度可以存放, 最终由数据类型所占字节决定
    2.如果没有超过宽度,且有zerofill限制, 会用0填充前置位的不足位
    3.没有必要规定整型的宽度, 默认设置的宽度就为该整型能存放数据的最大宽度 *
    '''
    
    # 整型约束(在安全模式下直接报错)
    mysql>: create table tb2(x tinyint unsigned);  # 0~255
    mysql>: insert into tb2 values(256), (-1);    # 255, 0
        
    # 0填充约束
    mysql>: create table tb3(x tinyint unsigned zerofill);
    mysql>: insert into tb3 values(10);  # 010
    

    浮点型

    重点:float(255, 30)、decimal(65, 30)

    类型

    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(255, 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));
    mysql>: insert into t12 values(1.11111111111111111119);  	# 进度最低,最常用
    # 1.111111164093017600000000000000 
    mysql>: insert into t13 values(1.11111111111111111119);		# 进度高,占位多
    # 1.111111111111111200000000000000	
    mysql>: insert into t14 values(1.11111111111111111119);		# 字符串存,全精度
    # 1.111111111111111111190000000000
    
    # 重点:长度与小数位分析
    # 报错,总长度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就用char。数据库优化

    类型

    char:定长,规定限制的字节,永远采用设置的长度存储数据
    varchar:不定长,在设置的长度范围内,变长的存储数据

    宽度

    作用:限制存储宽度

    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'
    

    时间类型

    重点:datetime(8字节,可以为null)、timestamp(4字节,有默认值CURRENT_TIMESTAMP)

    类型

    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
    

    枚举类型与集合类型

    类型

    enum:单选
    set:多选

    # 建表
    # 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', '女', '男,女,哇塞');  
    
  • 相关阅读:
    POJ3159 Candies —— 差分约束 spfa
    POJ1511 Invitation Cards —— 最短路spfa
    POJ1860 Currency Exchange —— spfa求正环
    POJ3259 Wormholes —— spfa求负环
    POJ3660 Cow Contest —— Floyd 传递闭包
    POJ3268 Silver Cow Party —— 最短路
    POJ1797 Heavy Transportation —— 最短路变形
    POJ2253 Frogger —— 最短路变形
    POJ1759 Garland —— 二分
    POJ3685 Matrix —— 二分
  • 原文地址:https://www.cnblogs.com/XuChengNotes/p/11588525.html
Copyright © 2011-2022 走看看