MySQL5.7数据类型之数值型

数据类型概述

  • MySQL的数据类型分为五大类
    • 数值型
    • 时间型
    • 字符串型
    • 空间型
    • JSON型
  • 本文主要详细描述数值型

数据类型基本概念

  • M:整数类型,M表示显示的最大宽度。浮点和定点类型,M是存储的总位数(精度)。字符串类型,M是最大长度。M的范围依赖于数据类型。
  • D:D在浮点和定点类型中表示小数位数。最大值为30,不能超过M-2
  • fps:fps用于time,datetime,timestamp类型表示分秒精度,也就是分秒的位数。范围在0-6,默认为6。
  • []:方括号表示类型定义的可选部分

数值型

分类

  • 整型
    • TYNYINT
    • SALLINT
    • INTEGER
    • MEDIUMINT
    • BIGINT
  • 定点型
    • DECIMAL
  • 浮点型
    • FLOAT
    • DOUBLE
  • BIT
    • BIT

数值型基本规则

  • M对于整型表示显示宽度,跟值的范围没有任何关系,最大值为255。例如:INT(5),代表字段显示宽度为5,它能表示的范围还是-2147483648~2147483647
  • M对于浮点型和定点型,表示存储位数
  • 如果列声明了ZEROFILL,那么自动带有UNSIGNED属性
  • 数值类型默认就是SIGNED,所以有没有这个属性没影响

整型类型声明详解

  • TINYINT[(M)] [UNSIGNED] [ZEROFILL]
    • M表示显示宽度,范围见下表。M会在查询时的元数据返回,是否适应取决于应用。当跟ZEROFILL配合使用时,如果长度小于M的值,会被0填充。比如TYNYINT(5) ZEROFILL,插入99的时候,会显示为00099
  • BOOL,BOOLEAN
    • 等同于TINYINT(1)
    • 数字0被认为时false,其他数字为true
      • SELECT IF(0, 'true', 'false');结果为false
      • SELECT IF(1, 'true', 'false');结果为true
      • SELECT IF(2, 'true', 'false');结果为true
    • 但是,当数字跟bool比较时,只有0被认为时false,1被认为是true,其余的比较都是false
      • SELECT IF(0 = FALSE, 'true', 'false');结果为true
      • SELECT IF(1 = TRUE, 'true', 'false');结果为true
      • SELECT IF(2 = TRUE, 'true', 'false');结果为false
      • SELECT IF(2 = FALSE, 'true', 'false');结果为false
  • SMALLINT[(M)] [UNSIGNED] [ZEROFILL]
    • 解释同TINYINT
  • MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]
    • 解释同TINYINT
  • INTEGER[(M)] [UNSIGNED] [ZEROFILL]
    • 解释同TINYINT
    • 等同于INT
  • BIGINT[(M)] [UNSIGNED] [ZEROFILL]
    • 解释同TINYINT
    • SERIAL等同于BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE
类型 存储位数 带符号最小值 无符号最小值 带符号最大值 无符号最大值
TINYINT 1 -128 0 127 255
SMALLINT 2 -32768 0 32767 65535
MEDIUMINT 3 -8388608 0 8388607 16777215
INT 4 -2147483648 0 2147483647 4294967295
BIGINT 8 -2^63 0 2^63-1 2^64-1

定点型详解

  • DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]
    • 表示一个精确的值,当存储跟钱相关的数据时推荐使用
    • 等同于DEC、NUMERIC、FIXED
    • M最大值为65,默认10;D最大值30,默认0
    • DECIMAL(5,2)表示存储范围为-999.99 to 999.99

浮点型详解

  • FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
    • 单精度浮点数,7位精度
  • DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
    • 双精度浮点数,15位精度
    • 等同于DOUBLE PRECISION
  • 存储近似值,如果没有指定M和D,实际存储范围取决于硬件和操作系统
  • M表示总位数,D表示小数位数
  • 使用UNSIGNED不会改变存储的最大值,只是不允许存储负数
  • 如果REAL_AS_FLOAT模式开启,REAL等同于FLOAT,否则等同于DOUBLE。默认未开启
  • FLOAT(p) [UNSIGNED] [ZEROFILL]
    • p代表精度,如果是0~24,数据类型就变成了FLOAR,如果是25~53就变成了DOUBLE;这个语法主要是为了兼容ODBC
  • 所以,注意FLOAT(5,2)和FLOAT(5)有本质的区别

BIT型详解

  • BIT(M)
    • M表示位数,范围是1~64,默认1。指定值时使用b'111',代表7,如果类型时BIT(6),那么会左填充,等于b'000111'

注意

  • 整型里面的M是显示宽度,跟范围没关系,只是在获取结果集元数据能拿到这个值,至于用不用,那就是应用的事了。比如int(3),你还是可以存个99999,没有任何影响。M用来配合ZEROFILL的时候,可以用作0填充,如果不到M位的,左边都是用0填充。
  • 整型使用了UNSIGNED属性,只能存储正数,且上限会变大。小数使用UNSIGNED只会不能允许存储负数,上限不变。
  • 整型和浮点型可以有AUTO_INCREMENT,如果这列是not null的,当插入null到这一列,它会自动设置一个字增值。AUTO_INCREMENT从1开始。设置为0根设置为null一样。
  • 数据溢出在严格模式下会报错,在非严格模式下会插入特定值,只是会显示警告,通过show warnings查看

参考文档

MySQL官网

posted @ 2021-03-25 15:16  java拌饭  阅读(466)  评论(0编辑  收藏  举报