zoukankan      html  css  js  c++  java
  • MySql

    数据类型

    mysql 常用数据类型

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

    1. 数值类型 & 浮点型 & 日期类型

    1.1 数值类型

    整数类型:TINYINT SMALLINT MEDIUMINT INT BIGINT

    作用:存储年龄,等级,id,各种号码等

    数据类型 无符号(unsigned)和有符号 用0填充 zerofill

    约束的作用: 保证数据的完整性和一直性

    • tinyint [-128~127] 小整数

    • int 整数

    • bigint 极大整数

      create table t1(id int(4) unsigned,name char(20));

    验证1:有符号和无符号tinyint

    ============有符号tinyint==============
    # 创建数据库db4
    create database db4 charset utf8;
    
    # 切换到当前db4数据库
    mysql> use db4;
    
    # 创建t1 规定x字段为tinyint数据类型(默认是有符号的)
    mysql> create table t1(x tinyint);
    
    # 验证,插入-1这个数
    mysql>   insert into t1 values(-1);
    
    # 查询 表记录,查询成功(证明默认是有符号类型)
    mysql> select * from t1;
    +------+
    | x    |
    +------+
    | -1 |
    +------+
    
    #执行如下操作,会发现报错。因为有符号范围在(-128,127)
    mysql>   insert into t1 values(-129),(128);
    ERROR 1264 (22003): Out of range value for column 'x' at row 1
    
    
    ============无符号tinyint==============
    # 创建表时定义记录的字符为无符号类型(0,255) ,使用unsigned
    mysql> create table t2(x tinyint unsigned);
    
    # 报错,超出范围
    mysql>   insert into t2 values(-129);
    ERROR 1264 (22003): Out of range value for column 'x' at row 1
    
    # 插入成功
    mysql>   insert into t2 values(255);
    Query OK, 1 row affected (0.00 sec)
    
    有符号和无符号的tinyint
    有符号和无符号tinyint

    验证2:int类型后面的存储是显示宽度,而不是存储宽度

    mysql> create table t3(id int(1) unsigned);
    
    #插入255555记录也是可以的
    mysql> insert into t3 values(255555);
    
    mysql> select * from t3;
    +--------+
    | id     |
    +--------+
    | 255555 |
    +--------+
    ps:以上操作还不能够验证,再来一张表验证用zerofill 用0填充
    
    # zerofill 用0填充
    mysql> create table t4(id int(5) unsigned zerofill);
    
    
    mysql> insert into t4 value(1);
    Query OK, 1 row affected (0.00 sec)
    
    #插入的记录是1,但是显示的宽度是00001
    mysql> select * from t4;
    +-------+
    | id    |
    +-------+
    | 00001 |
    +-------+
    row in set (0.00 sec)
    
    int 后面存储是显示宽度
    int类型后面的存储是显示宽度,而不是存储宽度

    1.2 浮点型

    定点数类型: DEC等同于DECIMAL

    作用:存储薪资、身高、体重、体质参数等

    浮点类型:FLOAT DOUBLE

    • float 单精度 随着小数位数的增多,不准确

    • double 双精度 随着小数位数的增多.不准确,比float要准确

    • decimal 小数 精准的小数

    -------------------------FLOAT-------------------
    FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
    #参数解释:单精度浮点数(非准确小数值),M是全长,D是小数点后个数。M最大值为255,D最大值为30
    
    #有符号:
               -3.402823466E+38 to -1.175494351E-38,
               1.175494351E-38 to 3.402823466E+38
    
    #无符号:
               1.175494351E-38 to 3.402823466E+38
    #精确度: 
               **** 随着小数的增多,精度变得不准确 ****
    
    
     -------------------------DOUBLE-----------------------
    DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
    
    #参数解释: 双精度浮点数(非准确小数值),M是全长,D是小数点后个数。M最大值为255,D最大值为30
    
    #有符号:
               -1.7976931348623157E+308 to -2.2250738585072014E-308
               2.2250738585072014E-308 to 1.7976931348623157E+308
    
    #无符号:
               2.2250738585072014E-308 to 1.7976931348623157E+308
    
    #精确度:
               ****随着小数的增多,精度比float要高,但也会变得不准确 ****
    
    ======================================
    --------------------DECIMAL------------------------
    decimal[(m[,d])] [unsigned] [zerofill]
    
    #参数解释:准确的小数值,M是整数部分总个数(负号不算),D是小数点后个数。 M最大值为65,D最大值为30。
    
    
    #精确度:
               **** 随着小数的增多,精度始终准确 ****
               对于精确数值计算时需要用此类型
               decaimal能够存储精确值的原因在于其内部按照字符串存储。
    
    语法
    语法
    #1验证FLOAT类型建表:
    mysql> create table t5(x float(256,31));
    ERROR 1425 (42000): Too big scale 31 specified for column 'x'. Maximum is 30.
    mysql> create table t5(x float(256,30));
    ERROR 1439 (42000): Display width out of range for column 'x' (max = 255)
    mysql> create table t5(x float(255,30)); #建表成功
    Query OK, 0 rows affected (0.03 sec)
    
    #2验证DOUBLE类型建表:
    mysql> create table t6(x double(255,30)); #建表成功
    Query OK, 0 rows affected (0.03 sec)
    
    #3验证deimal类型建表:
    mysql> create table t7(x decimal(66,31));
    ERROR 1425 (42000): Too big scale 31 specified for column 'x'. Maximum is 30.
    mysql> create table t7(x decimal(66,30));
    ERROR 1426 (42000): Too big precision 66 specified for column 'x'. Maximum is 65.
    mysql> create table t7(x decimal(65,30)); #建表成功
    Query OK, 0 rows affected (0.00 sec)
    
    验证三种建表方式
    验证三种建表方式
    # 分别对三张表插入相应的记录
    mysql> insert into t5 values(1.1111111111111111111111111111111);#小数点后31个1
    Query OK, 1 row affected (0.01 sec)
    
    mysql> insert into t6 values(1.1111111111111111111111111111111);
    Query OK, 1 row affected (0.01 sec)
    
    mysql> insert into t7 values(1.1111111111111111111111111111111);
    Query OK, 1 row affected, 1 warning (0.00 sec)
    
    # 查询结果
    mysql> select * from t5; #随着小数的增多,精度开始不准确
    +----------------------------------+
    | x                                |
    +----------------------------------+
    | 1.111111164093017600000000000000 |
    +----------------------------------+
    row in set (0.00 sec)
    
    mysql> select * from t6; #精度比float要准确点,但随着小数的增多,同样变得不准确
    +----------------------------------+
    | x                                |
    +----------------------------------+
    | 1.111111111111111200000000000000 |
    +----------------------------------+
    row in set (0.00 sec)
    
    mysql> select * from t7; #精度始终准确,d为30,于是只留了30位小数
    +----------------------------------+
    | x                                |
    +----------------------------------+
    | 1.111111111111111111111111111111 |
    +----------------------------------+
    row in set (0.00 sec)
    
    验证三种类型的精度
    验证三种类型的精度

    1.3 日期类型

    year 年份 (1901~2155)

    date 年月日

    time 时分秒

    datetime 年月日 时分秒

    now() sql语言中自带的内容函: 获取当前的时间(根据数据类型)

    create table t10(born_year year,intClass datetime);

    2.char类型 &varchar类型

    • char类型
      #注意:char和varchar括号内的参数指的都是字符的长度
      
      #char类型:定长,简单粗暴,浪费空间,存取速度快
          字符长度范围:0-255(一个中文是一个字符,是utf8编码的3个字节)
          存储:
              存储char类型的值时,会往右填充空格来满足长度
              例如:指定长度为10,存>10个字符则报错,存<10个字符则用空格填充直到凑够10个字符存储
      
          检索:
              在检索或者说查询时,查出的结果会自动删除尾部的空格,除非我们打开pad_char_to_full_length SQL模式(设置SQL模式:SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
            查询sql的默认模式:select @@sql_mode;)
    • varchar类型
      #varchar类型:变长,精准,节省空间,存取速度慢
          字符长度范围:0-65535(如果大于21845会提示用其他类型 。mysql行最大限制为65535字节,字符编码为utf-8:https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html)
          存储:
              varchar类型存储数据的真实内容,不会用空格填充,如果'ab  ',尾部的空格也会被存起来
              强调:varchar类型会在真实数据前加1-2Bytes的前缀,该前缀用来表示真实数据的bytes字节数(1-2Bytes最大表示65535个数字,正好符合mysql对row的最大字节限制,即已经足够使用)
              如果真实的数据<255bytes则需要1Bytes的前缀(1Bytes=8bit 2**8最大表示的数字为255)
              如果真实的数据>255bytes则需要2Bytes的前缀(2Bytes=16bit 2**16最大表示的数字为65535)
      
          检索:
              尾部有空格会保存下来,在检索或者说查询时,也会正常显示包含空格在内的内容
    • 小结

      #varchar类型:变长,精准,节省空间,存取速度慢
          字符长度范围:0-65535(如果大于21845会提示用其他类型 。mysql行最大限制为65535字节,字符编码为utf-8:https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html)
          存储:
              varchar类型存储数据的真实内容,不会用空格填充,如果'ab  ',尾部的空格也会被存起来
              强调:varchar类型会在真实数据前加1-2Bytes的前缀,该前缀用来表示真实数据的bytes字节数(1-2Bytes最大表示65535个数字,正好符合mysql对row的最大字节限制,即已经足够使用)
              如果真实的数据<255bytes则需要1Bytes的前缀(1Bytes=8bit 2**8最大表示的数字为255)
              如果真实的数据>255bytes则需要2Bytes的前缀(2Bytes=16bit 2**16最大表示的数字为65535)
      
          检索:
              尾部有空格会保存下来,在检索或者说查询时,也会正常显示包含空格在内的内容

    3枚举和集合

    字段的值只能在给定范围中选择,如单选框,多选框

    • 枚举 :enum 单选 只能在给定的范围内选一个值,如性别 sex 男male/女female
    • 集合:set 多选 在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2,爱好3...)

     示例:

    mysql>  create table consumer(
        ->      id int,
        ->      name varchar(50),
        ->      sex enum('male','female','other') default 'male',
        ->      level enum('vip1','vip2','vip3','vip4'),#在指定范围内,多选一
        ->      fav set('play','music','read','study') #在指定范围内,多选多
        ->     );
    Query OK, 0 rows affected (0.37 sec)
    
    mysql> insert into consumer values(1,'tony','male','vip2','play,study');
    Query OK, 1 row affected (0.07 sec)
    
    mysql> select * from  consumer;
    +------+------+------+-------+------------+
    | id   | name | sex  | level | fav        |
    +------+------+------+-------+------------+
    |    1 | tony | male | vip2  | play,study |
    +------+------+------+-------+------------+
    1 row in set (0.00 sec)
  • 相关阅读:
    Scrapy 概览笔记
    Python 依赖版本控制 (requirements.txt 文件生成和使用)
    Python 虚拟空间的使用
    macOS 所有版本 JDK 安装指南 (with Homebrew)
    鉴权那些事
    Java 位运算符和 int 类型的实现
    ASP.NET Core 入门教程 5、ASP.NET Core MVC 视图传值入门
    如何做好一次知识或技术分享
    ASP.NET Core 入门教程 4、ASP.NET Core MVC控制器入门
    ASP.NET Core 入门教程 3、ASP.NET Core MVC路由入门
  • 原文地址:https://www.cnblogs.com/wcx666/p/10554917.html
Copyright © 2011-2022 走看看