全部产品
阿里云办公

数值类型

更新时间:2017-06-07 13:26:11

数值类型按精确度可以划分为两类:

  • 精确数据类型
    • 整数数据类型 TINYINT, SAMLLINT, MEDIUMINT, INTEGER, BIGINT
    • 定点数据类型 DECIMAL, NUMERIC
  • 近似数据类型 FLOAT, REAL, DOUBLE PRECISIONs

整数数据类型如下表:

类型大小(字节)范围最小值最大值
(带符号的/无符号的)(带符号的/无符号的)(带符号的/无符号的)
TINYINT127-1-128127
28-10255
SMALLINT2215-1-3276832767
216-1065535
MEDIUMINT3223-1-83886088388607
224-1016777215
INT4231-1-21474836482147483647
232-104294967295
BIGINT8263-1-92233720368547758089223372036854775807
264-1018446744073709551615

定点数据类型如下表:

类型范围用途
DECIMAL (M,D)
NUMERIC (M,D)
DECIMAL、NUMERIC等价;
变长数据类型;
精度(M)最大位数38,标度(D)最大位数30,具体取值范围是受精度和标度的约束。(与MySQL不一致)
定点数值

浮点数据类型如下:

类型大小(字节)用途
FLOAT4单精度浮点数值
FLOAT(p)如果0 <= p <= 24为4个字节,
如果25 <= p <= 53为8个字节
0到24的精度对应FLOAT列的4字节单精度。
25到53的精度对应DOUBLE列的8字节双精度。
DOUBLE [PRECISION]8双精度浮点数值

说明

  1. 在TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT类型中都可以指定显示宽度,格式为“数据类型(M)”,比如INT(20),这里的M指示最大显示宽度。最大有效显示宽度是255。显示宽度与存储大小或类型包含的值的范围无关。

  2. UNSIGNED 修饰符规定字段只保存正值。

  3. ZEROFILL修饰符规定0(不是空格)可以用于填补输出值。如果为一个数值列指定ZEROFILL,系统自动为该列添加UNSIGNED属性。

  4. SERIAL是BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE的一个别名。在整数列定义中,SERIAL DEFAULT VALUE是NOT NULL AUTO_INCREMENT UNIQUE的一个别名。

  5. BOOL(BOOLEAN)类型等价于TINYINT类型。

  • TINYINT

    TINYINT[(M)] [UNSIGNED] [ZEROFILL]

    很小的整数。带符号的范围是-128到127。无符号的范围是0到255。

  • BOOL,BOOLEAN

    是TINYINT(1)的同义词。zero值被视为假。非zero值视为真。

  • SMALLINT

    SMALLINT[(M)] [UNSIGNED] [ZEROFILL]

    小的整数。带符号的范围是-32768到32767。无符号的范围是0到65535。

  • MEDIUMINT

    MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]

    中等大小的整数。带符号的范围是-8388608到8388607。无符号的范围是0到16777215。

  • INT

    INT[(M] [UNSIGNED] [ZEROFILL]

    普通大小的整数。带符号的范围是-2147483648到2147483647。无符号的范围是0到4294967295。

    将非法的int值插入表之前会自动改为0。

  • INTEGER

    INTEGER[(M)] [UNSIGNED] [ZEROFILL]

    INT的同义词。

  • BIGINT

    BIGINT[(M)] [UNSIGNED] [ZEROFILL]

    大整数。带符号的范围是-9223372036854775808到9223372036854775807。无符号的范围是0到18446744073709551615。

    使用带符号的BIGINT或DOUBLE值进行所有算法,因此除了位函数,不应使用大于9223372036854775807(63位)的无符号的大整数!如果这样做,结果中的最后几位可能出错,这是由于将BIGINT值转换为DOUBLE进行四舍五入时造成的错误。

    可以在以下情况下处理BIGINT:

    • 当使用整数在一个BIGINT列保存大的无符号的值时。

    • 在MIN(col_name)或MAX(col_name)中,其中col_name指BIGINT列。

    • 使用操作符(+,-,*等等)并且两个操作数均为整数时。

    • 总是可以使用一个字符串在BIGINT列中保存严格整数值。在这种情况下,执行字符串-数字转换,其间不存在双精度表示。

    • 当两个操作数均为整数值时,-、+和* 操作符使用BIGINT算法。这说明如果乘两个大整数(或来自返回整数的函数),当结果大于9223372036854775807时,会得到意想不到的结果。

  • FLOAT

    FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]

    小(单精度)浮点数。允许的值范围为-2128 ~ +2128,也即-3.402823466E+38到-1.175494351E-38、0和1.175494351E-38到3.402823466E+38。这些是理论限制,基于IEEE标准。实际的范围根据硬件或操作系统的不同可能稍微小些。

    M是小数总位数,D是小数点后面的位数。如果MD被省略,根据硬件允许的限制来保存值。单精度浮点数精确到大约7位小数位。

    如果指定UNSIGNED,不允许负值。

    使用浮点数可能会遇到意想不到的问题,因此所有计算用双精度完成。

  • DOUBLE

    DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]

    普通大小(双精度)浮点数。允许的值范围为:-21024 ~ +21024,也即是-1.7976931348623157E+308到-2.2250738585072014E-308、0和2.2250738585072014E-308到 1.7976931348623157E+308。这些是理论限制,基于IEEE标准。实际的范围根据硬件或操作系统的不同可能稍微小些。

    M是小数总位数,D是小数点后面的位数。如果MD被省略,根据硬件允许的限制来保存值。双精度浮点数精确到大约15位小数位。

    如果指定UNSIGNED,不允许负值。

  • DOUBLE PRECISION

    DOUBLE PRECISION [(M,D)] [UNSIGNED] [ZEROFILL], REAL[(M,D)] [UNSIGNED] [ZEROFILL]

    为DOUBLE的同义词。

  • FLOAT(p)

    FLOAT(p) [UNSIGNED] [ZEROFILL]

    浮点数。p表示精度(以位数表示),只使用该值来确定是否结果列的数据类型为FLOAT或DOUBLE。如果p为从0到24,数据类型变为没有M或D值的FLOAT。如果p为从25到53,数据类型变为没有M或D值的DOUBLE。结果列范围与本节前面描述的单精度FLOAT或双精度DOUBLE数据类型相同。

  • DECIMAL(与MySQL不完全一致)

    DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]

    压缩的“严格”定点数。M是小数位数(精度)的总数,D是小数点(标度)后面的位数。小数点和‘-’(负数)符号不包括在M中。如果D是0,则值没有小数点或分数部分。DECIMAL整数最大位数(M)为38(MySQL 为65)。支持的十进制数的最大位数(D)是30。如果D被省略, 默认是0。如果M被省略, 默认是10。

    如果指定UNSIGNED,不允许负值。

    所有DECIMAL列的基本计算(+,-,*,/)用38(MySQL为65)位精度完成。

    DEC[(M[,D])] [UNSIGNED] [ZEROFILL], NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL]是DECIMAL的同义词。FIXED同义词适用于与其它服务器的兼容性。

  • NUMERIC

    NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL]是DECIMAL的同义词。