Float和Double
MySQL将四个字节用于单精度值,并将八个字节用于双精度值。Float、DOUBLE类型代表近似数值。对于FLOAT,SQL标准允许对FLOAT括号中的关键字后面的位以精度(但不允许指数的范围)进行可选的规范。由于浮点值是近似值而不是作为精确值存储的,因此在比较中尝试将它们视为精确值可能会导致问题。它们还受平台或 实现依赖性的约束。如果需要表示的精确度很高时,如货币数据,最好使用decimal。
DECIMAL
DECIMAL以字符串的形式存储, 可能的最大取值范围与 DOUBLE 相同,但是有效的取值范围由 M 和 D 决定。DECIMAL(M,D)如果改变 M 而固定 D,则取值范围将随 M 的变大而变大。M的默认值为10,D的默认值是0.(精确的行为是特定于操作系统的,但是通常效果是将其截断为允许的位数。)
例如 decimal(5,2),5是精度,2是小数位数。精度表示值存储的有效位数,小数位数表示小数点后可以存储的位数。所以可以表示为123.12
浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的范围;但缺点是会引起精度问题。并且两个浮点数进行减法和比较运算时也容易出问题,所以在使用浮点数时需要注意,并尽量避免做浮点数比较。
TIMESTAMP 与 DATETIME
TIMESTAMP 与 DATETIME 除了存储字节和支持的范围不同外,还有一个最大的区别是:DATETIME 在存储日期数据时,按实际输入的格式存储,即输入什么就存储什么,与时区无关;而 TIMESTAMP 值的存储是以 UTC(世界标准时间)格式保存的,存储时对当前时区进行转换。
BINARY 和 VARBINARY
BINARY 和 VARBINARY 类似于 CHAR 和 VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
在将数据转换为二进制数据时,SQL Server会对生成的二进制数据进行填充或截断。
当BINARY被存储的值,它们被右侧填充垫值到指定的长度。填充值为0x00(零字节)。值在0x00插入时用右填充,不会删除尾随字节以进行检索。所有字节在比较中都很重要,包括ORDER BY和DISTINCT操作。 0x00比较中,空间和空间有所不同,0x00先于空间进行 排序。
示例:对于BINARY(3)列, 在插入时'a '变为 'a \0'。 插入时'a\0'变为'a\0\0'。两个插入的值均保持不变以进行检索。
对于VARBINARY,没有用于插入的填充,也没有剥离任何字节以进行检索。所有字节在比较中都很重要,包括ORDER BY和DISTINCT操作。 0x00比较中,空间和空间有所不同,0x00先于空间进行 排序。
对于那些删除尾部填充字节或比较将其忽略的情况,如果一列具有要求唯一值的索引,则将仅尾部填充字节数不同的值插入该列会导致重复键错误。例如,如果表包含'a',则尝试存储'a\0'会导致重复键错误。
BLOB
BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。