• mysql numberic types ---- mysql 数值类型详解


    编程语言中大多都有数据类型一说、虽然mysql 的sql 语句与标准sql 有别、但是宏观上看还是差不多的;下面我们说一下mysql数据库中的数值类型

    一、在mysql里有那些类型可以表示数值

      1、总体上看mysql 对数值类型的分类,可以分为整型(整数),浮点型(小数点的数)

      整型:

    bit       [(m)] 
    tinyint   [(m)] [unsigned] [zerofill]
    smallint  [(m)] [unsigned] [zerofill]
    mediumint [(m)] [unsigned] [zerofill]
    int       [(m)] [unsigned] [zerofill]
    bigint    [(m)] [unsigned] [zerofill]
    
    bool                                  -- 它是tinyint(1) 的别名
    serial    [(m)] [unsigned] [zerofill] -- 它是bigint unsigned not null auto_increment unique 的别名

      浮点型:

    decimal   [(m,d)] [unsigned] [zerofill] 
    float     [(m,d)] [unsigned] [zerofill]
    double    [(m,d)] [unsigned] [zerofill] 
    dec       [(m,d)] [unsigned] [zerofill] -- 它是decimal 的别名
    numerric  [(m,d)] [unsigned] [zerofill] -- 它是decimal 的别名
    fixed     [(m,d)] [unsigned] [zerofill] -- 它是decimal 的别名
    double precision [(m,d)] [unsigned] [zerofill] -- 它是double 的别名
    real      [(m,d)] [unsigned] [zerofill]        -- 它是double 的别名

    二、整数类型中的 m 表示什么意思

      1、对于bit 来说 m 表示要保存的二进制位的长度,最大为64。

      2、对于其它整数来说 m 表示的是数值的展示长度,还刻生活中的1号,我们有时候也写成0001号吗?这里把1展示成0001

      就是说它的展示长度是4位;1只有一位,0001有四位,生活中我们的大脑自动用0来补充了前面的三个空位,但是在MySQL

      中我们要为它显示的指定 zerofill 属性。 

      3、例子

    mysql> create table t(x int(4)); -- 4位展示宽度
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> insert into t(x) values(1),(22),(333),(4444),(55555);
    Query OK, 5 rows affected (0.00 sec)
    Records: 5  Duplicates: 0  Warnings: 0
    
    mysql> select * from t; -- 没有和zerofill 配合是看不要m的效果的
    +-------+
    | x     |
    +-------+
    |     1 |
    |    22 |
    |   333 |
    |  4444 |
    | 55555 |
    +-------+
    5 rows in set (0.00 sec)
    
    mysql> alter table t modify column x int(4) zerofill; -- 加上 zerofill 属性
    Query OK, 5 rows affected (0.02 sec)
    Records: 5  Duplicates: 0  Warnings: 0
    
    mysql> select * from t;
    +-------+
    | x     |
    +-------+
    |  0001 |
    |  0022 |
    |  0333 |
    |  4444 |
    | 55555 |
    +-------+
    5 rows in set (0.00 sec)

    三、浮点数中的 md :

      1、m 表示总长度(小数点前的位数 + 小数据点后的位数)

      2、d  表示小数点后的位数,这两个数据中可以推出一个等式   小数据点前的位数 = m - d 

      3、例子:定义一个列 x 小数点前只能保存两位数,小数据点后只能保存两位数

    mysql> create table t(x decimal(4,2)); -- 定义decimal 类型的x 只能保存2位整数,和2位小数
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> insert into t(x) values(1.1),(22.22); -- 满足定义
    Query OK, 2 rows affected (0.01 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
    mysql> insert into t(x) values(1.111); -- 小数部分超出范围会被舍去
    Query OK, 1 row affected, 1 warning (0.00 sec)
    
    mysql> select * from t;
    +-------+
    | x     |
    +-------+
    |  1.10 |
    | 22.22 |
    |  1.11 |
    +-------+
    3 rows in set (0.01 sec)
    
    mysql> insert into t(x) values(333.22); -- 整数部分超出范围会报错
    ERROR 1264 (22003): Out of range value for column 'x' at row 1

    四、数值类型中的unsignedzerofill: 

      1、unsigned 专业点来说这个叫无符号、所以负数就保存不了,了! 把之前存负数的空间也都用来保存正数, 所以能保存的正数的数量就多了。

      2、zerofill 表示当数值的长度小了展示宽度时,用0 去填充那些不足的宽度(可以见二当中的例子)。

      3、如果为一个列指定了zerofill 属性 那么mysql会自己为列加上unsigned 属性。

    五、各个类数值列所占空间的大小

      1、整数

    type            storage(byte)       min                     max
    
    tinyint         1                   -128                    127
    smallint        2                   -32768                  32767
    mediumint       3                   -8388608                8388607
    int             4                   -2147483648             2147483647
    bigint          8                   -9223372036854775808    9223372036854775807

      2、浮点数

    type            storage(byte)       min                     max
    float           4                   
    double          8

      3、decimal 

      官方文档中没有看到相关的内容,我猜这可能是用的大数算法;就是说decimal(m,d) 会战用m 个字节!这样做虽然占空间,但是

      它有一个好处就是可以精确的保存值;不像float 和double 这类的数据类型只能保存近似值!

    ----

    学习交流

  • 相关阅读:
    jquery事件优化---事件委托
    2017年7月6号,总结所遇到的问题
    js日期函数
    跨域请求所遇到的错误
    ajax设置Access-Control-Allow-Origin实现跨域访问
    php提前输出响应及注意问题
    php中的日期和时间
    跨域请求json数据
    C++ 与 Visual Studio 2019 和 WSL(四)——库组件
    fpic 和 fPIC
  • 原文地址:https://www.cnblogs.com/JiangLe/p/6921811.html
Copyright © 2020-2023  润新知