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。它们区别在于可容纳存储范围不同。同样TEXT也有四种类型: TINYTEXT,TEXT, MEDIUMTEXT,和LONGTEXT。这些对应于四种BLOB类型,并且具有相同的最大长度和存储要求。
BLOB值被视为二进制字符串(字节字符串)。它们具有binary 字符集和排序规则,并且比较和排序基于列值中字节的数字值。 TEXT值被视为非二进制字符串(字符字符串)。它们具有 binary以外的字符集,并且根据字符集的排序规则对值进行排序和比较。
在大多数情况下可以将BLOB列看做VARBINARY,相似的,可以将TEXT列视为VARCHAR。但是BLOB、TEXT与VARBINARY、VARCHAR的不同在于:
对于BLOB和TEXT的索引列,必须指定索引前缀长度。但对于CHAR和VARCHAR,前缀长度是可选的。
BLOB和TEXT列不能有DEFAULT值。
MySQL Connector / ODBC将BLOB值定义为 LONGVARBINARY,将TEXT 值定义为LONGVARCHAR。
由于BLOBandTEXT 值可能非常长,因此在使用它们时可能会遇到一些限制:
使用临时表处理的查询结果中的 实例BLOB或 TEXT列会导致服务器在磁盘而不是内存中使用表,因为 MEMORY存储引擎不支持这些数据类型。使用磁盘会导致性能下降,因此仅在确实需要时在查询结果中包含 BLOB或TEXT列。例如,避免使用 SELECT *选择所有列的。
SET和ENUM
ENUM 是一个字符串对象,值为表创建时列规定中枚举的一列值。
SET 是一个字符串的对象,可以有零或多个值,SET 列最多可以有 64 个成员,值为表创建时规定的一列值。指定包括多个 SET 成员的 SET 列值时,各成员之间用逗号,隔开。如果插入 SET 字段中的列值有重复,则 MySQL 自动删除重复的值;插入 SET 字段的值的顺序并不重要,MySQL 会在存入数据库时,按照定义的顺序显示;如果插入了不正确的值,默认情况下,MySQL 将忽视这些值,给出警告。
与 ENUM 类型相同,SET 值在内部用整数表示,列表中每个值都有一个索引编号。当创建表时,SET 成员值的尾部空格将自动删除。
但与 ENUM 类型不同的是,ENUM 类型的字段只能从定义的列值中选择一个值插入,而 SET 类型的列可从定义的列值中选择多个字符的联合。