mysql5.7数字类型总览
https://dev.mysql.com/doc/refman/5.7/en/numeric-type-overview.html
如果在定义的列上指定了ZEROFILL,那么MYSQL会自动的添加UNSIGNED属性(有UNSIGNED属性同样也有SIGNED函性,SIGNED是默认属性)。
SERIAL是BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE的别名。
在定义一个整型列时使用SERIAL DEFAULT VALUE代表NOT NULL AUTO_INCREMENT UNIQUE。
M指定了最大的整数显示宽度,这个最大显示宽度是255。显示宽度和取值范围无关。对于浮点型和固定小数点的类型,M指定的是数字的总宽度。
Warning
When you use subtraction between integer values where one is of type UNSIGNED
, the result is unsigned unless the NO_UNSIGNED_SUBTRACTION
SQL mode is enabled. See Section 12.10, “Cast Functions and Operators”.
- BIT[(M)]:二进制位类型。M指定了每个数的位数,从1到64.默认值是1。
- TINYINT[(M)][UNSIGNED][ZEROFILL]:非常小的整数。有符号数的范围是-128~127。无符号数的范围是0~255.
- BOOL,BOOLEAN:这些和TINYINT(1)同义。零值被认为是false,非零值被认为是true:
mysql> select if(1,'true','false'); +----------------------+ | if(1,'true','false') | +----------------------+ | true | +----------------------+ 1 row in set (0.00 sec) mysql> select if(1,'false','true'); +----------------------+ | if(1,'false','true') | +----------------------+ | false | +----------------------+ 1 row in set (0.00 sec) mysql> select if(0,'true','false'); +----------------------+ | if(0,'true','false') | +----------------------+ | false | +----------------------+ 1 row in set (0.00 sec)
但是TRUE和FALSE仅仅代表1和0。
- SMALLINT[(M)][UNSIGNED][ZEROFILL]:小整数,有符号取值范围是-32768到32767。无符号取值范围是0到65535。
- MEDIUMINT[(M)][UNSIGNED][ZEROFILL]:比SMALLINT取值范围要大的整数,有符号取值范围-8388608到8388607,无符号取值范围是0到16777215。
- INT[(M)][UNSIGNED][ZEROFILL]:整型,有符号取值范围-2147483648到214748647,无符号取值范围0到4294967295。
- INTEGER[(M)][UNSIGNED][ZEROFILL]:和INT类型一样。
- BIGINT[(M)][UNSIGNED][ZEROFILL]:大整数,有符号的取值范围是-9223372036854775808到9223372036854775807。无符号的范围是0到18446744073709551615。
对于BIGINT类型的列要知道以下几点: (一)所有的算数运算使用的都是有符号的BIGINT或DOUBLE值,所以除非是使用位操作函数否则你不应该使用无符号的BIGINT大于9223372036854775807 (63 bits),如果你这么做了结果中的最后几个数字可能是错的,因为在BIGINT转换成DOUBLE时会有精度损失。MYSQL能处理BIGINT在如下几种情况。 (1)使用整数存储一个很大的无符号值。 (2)在MIN(col name)或MAX(col name),这个COL NAME是一个BIGINT列。 (3)两边都是整数时使用算数运算符号(+,-,*等等) (二)你可以把一个字符串存储到BIGINT列中。在这时,MYSQL执行一个字符串到数值的转换,这个转换并不会涉及到中间转换成双精度再转成整型。 (三)当算数运算符(+,-,*)两边都是整型时,使用BIGINT算数运算。这意味着如果你将两个大整数相乘(或者从某个函数返回整数),当该值可能大于9223372036854775807时,你可能得到一个意想不到的结果。
-
DECIMAL[(M[,D])][UNSIGNED][ZEROFILL]:这是一个定点值。M是数字的总长度,D是小数点后面有几位。小数点和正负号不计算在总长度M中。如果D是0,数值没有小数点后面的位数。M的最大值是65。最大支持的D值是30。如果D被忽略,默认是0。如果M被忽略,默认值是10。如果指定了UNSIGNED,不允许负数。所有在DECIMAL列上的基本计算(+,-,*,/)精度是65位数字。
-
DEC[(M[,D])] [UNSIGNED] [ZEROFILL], NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL], FIXED[(M[,D])][UNSIGNED][ZEROFILL] :这些类型和DECIMAL有相同意义。FIXED可兼容于其他数据库系统。
- FLOAT[(M,D)][UNSIGNED][ZEROFILL]:小单精度数。取值范围是-3.402823466E+38到-1.175494351E-38,0,1.175494351E-38到3.402823466E+38。这些是基于IEEE标准的理论极限。实际上要根据你的系统硬件可能会稍微小一点。M是总位数,D是小数点后的位数。如果M和D都被忽略,值以硬件极限存储。单精度数大约是7位有效数字。如果指定了UNSIGNED,那么不可以赋予负值。使用FLOAT可能会给你代来一些意想不到的问题,因为MYSQL使用浮点双精度在所有的运算中。
- DOUBLE[(M,D)][UNSIGNED][ZEROFILL]:正常大小的双精度数。值的范围是 -1.7976931348623157E+308 到 -2.2250738585072014E-308, 0, and 2.2250738585072014E-308 到 1.7976931348623157E+308。这些是IEEE标准的理论极限。实际范围根据硬件可能要稍微小一些。M是总位数,D是小数位。如果M和D被忽略,值以硬件的极限大小存储。一个浮点双精度值大约15位。UNSIGNED被指定,那么不能赋予负值。
- DOUBLE PRECISION[(M,D)][UNSIGNED][ZEROFILL], REAL[(M,D)][UNSIGNED][ZEROFILL]:这些类型和DOUBLE同义。例外:如果REAL AS FLOAT的SQL模式开启,那么REAL就会做为FLOAT而不是DOUBLE。
- FLOAT(p)[UNSIGNED][ZEROFILL]:单精度数。p指定了精度位数(二进制,之前的M和D是十进制位数),但是MYSQL仅在决定是否使用FLOAT或DOUBLE做为结果数据类型时才会有用。如果p是0到24,数据类型为没有指定M和D的FLOAT类型。如果是25到53,那么类型是DOUBLE。结果的取值范围还是和上面描述FLOAT和DOUBLE的一样。