在MySQL表中使用不同的数据类型来构建列。例如 SMALLINT , MEDIUMINT 和 INT 。据我所知,不同的数据类型会根据列类型影响表大小。因此,不必将 UNSIGNED INT 分配给范围在0-1000之间的值。
如果将MySQL中不同数据类型的值相乘,会发生什么情况(例如 SMALLINT * INT )?存储结果需要什么MySQL数据类型?
答案 0 :(得分:1)
MySQL为算术运算定义了一些规则。
如果两个操作数都是整数,则+
,-
,*
结果计算为BIGINT
(64位)精度(例如{{ 1}},SMALLINT
)
如果两个操作数都是整数且其中任何一个都是INT
,则结果为无符号整数。对于减法(UNSIGNED
),如果启用了-
SQL模式,则结果将被签名。
如果NO_UNSIGNED_SUBTRACTION
,+
,-
,/
,*
的任何操作数都是真实的(例如%
}或FLOAT
)或字符串值(例如DOUBLE
)结果的精度是具有最大精度的操作数的精度。
在具有不同数据类型的列之间进行算术运算是安全的。 MySQL将自动转换为适当的格式。
至于存储结果,存在一些限制。
如果插入了超出范围的值,则将存储最大端点(例如,插入130到'10.13e-3'
将存储127并发出警告)。如果启用了严格模式,则插入将失败并引发错误。
整数溢出导致无声环绕(例如9223372036854775807 + 1 = -9223372036854775808。这是因为它是使用TINYINT
数据类型的最大可能操作。)
当为浮点或定点列指定的值超出指定(或默认)精度和比例所隐含的范围时,MySQL会存储表示该范围的相应端点的值
浮点溢出会产生BIGINT
结果。某些操作可能会导致NULL
,+INF
或“NaN”。
-INF
数据类型,如果溢出,将被截断。并提出警告。
参考文献(来自dev.mysql.com):