前言
了解不同数据类型字段设置长度大小,从而在使用Mysql数据库时为使用的字段设置适当的长度。
CHAR与VARCHAR
CHAR 是固定长度的,所以它的处理速度比 VARCHAR 快得多,但是其缺点是浪费存储空间,程序需要对行尾空格进处理,所以对于那些长度变化不大并且对查询速度有较高要求的数据可以考虑使用 CHAR 类型来存储。
在 MySQL 中,不同的存储引擎对 CHAR 和 VARCHAR 的使用原则有所不同,这里简单概括如下。
-
MyISAM 存储引擎:建议使用固定长度的数据列代替可变长度的数据列。
-
MEMORY 存储引擎:目前都使用固定长度的数据行存储,因此无论使用 CHAR 或 VARCHAR 列都没有关系。两者都是作为 CHAR 类型处理。
-
InnoDB 存储引擎:建议使用 VARCHAR 类型。对于 InnoDB 数据表,内部的行存储格式没有区分固定长度和可变长度列(所有数据行都使用指向数据列值的头指针),因此在本质上,使用固定长度的 CHAR 列不一定比使用可变长度 VARCHAR 列性能要好。因而,主要的性能因素是数据行使用的存储总量。由于 CHAR 平均占用的空间多于 VARCHAR,因此使用 VARCHAR 来最小化需要处理的数据行的存储总量和磁盘 I/O 是比较好的。
浮点数与定点数
浮点数:一般用于表示含有小数部分的数值。当一个字段被定义为浮点类型后,如果插入数据的精度超过该列定义的实际精度,则插入值会被四舍五入到实际定义的精度值,然后插 入,四舍五入的过程不会报错。在 MySQL 中 float、double(或 real)用来表示浮点数。
定点数:不同于浮点数,定点数实际上是以字符串形式存放的,所以定点数可以更加精确 的保存数据。如果实际插入的数值精度大于实际定义的精度,则 MySQL 会进行警告(默认 的 SQLMode 下),但是数据按照实际精度四舍五入后插入;如果 SQLMode 是在 TRADITIONAL (传统模式)下,则系统会直接报错,导致数据无法插入。在 MySQL 中,decimal(或 numberic) 用来表示定点数。
在今后关于浮点数和定点数的应用中,用户要考虑到以下几个原则:
- 浮点数存在误差问题;
- 对货币等对精度敏感的数据,应该用定点数表示或存储;
- 在编程中,如果用到浮点数,要特别注意误差问题,并尽量避免做浮点数比较;
- 要注意浮点数中一些特殊值的处理。
日期
MySQL 提供的常用日期类型有 DATE、TIME 、DATETIME、TIMESTAMP。下面主要总结一下选择日期类型的原则。
- 根据实际需要选择能够满足应用的最小存储的日期类型。如果应用只需要记录“年份”,那么用 1个字节来存储的 YEAR 类型完全可以满足,而不需要用 4 个字节来存储的 DATE 类型。这样不仅仅能节约存储,更能够提高表的操作效率。
- 如果要记录年月日时分秒,并且记录的年份比较久远,那么最好使用 DATETIME,而不要使用 TIMESTAMP。因为 TIMESTAMP 表示的日期范围比 DATETIME 要短得多。
- 如果记录的日期需要让不同时区的用户使用,那么最好使用 TIMESTAMP,因为日期类型中只有它能够和实际时区相对应。
后语
谢谢阅读!!!