3.1.1. 整数
数字可以分为两种,整数和非整数(即带有小数部分的数)。如果你需要存储一个整数,那么可以使用如下几种数字类型:TINYINT,SMALLINT,MEDIUMINT,INT,以及BIGINT。这些分别代表8,16,24,32以及64位的存储空间。他们可以存储-2(N-1)到2(N-1)-1的数字,其中N是类型所需要的存储空间位。
整数类型还可以选用UNSIGNED属性,它将不允许负数并且可以将你所能存储的数据范围提高大约2倍。比如,TINYINT UNSIGNED可以存储从0到255的数据,而TINYINT只能存储从-128到127的数据。
有符号和无符号类型使用同样的存储空间,因此也有相同的效率,一般我们可以根据需要来选用其中一种。
你的选择将决定MySQL如何来存储数据,在内存中或者是在硬盘上。然而,数字计算一般使用64位的BIGINT,即使在32位机上也是一样的。(在一些使用DECIMAL和DOUBLE的聚合函数中可能会有例外)。
MySQL让你可以指定一个整数类型的“宽度”,比如INT(11)。这对于大多数应用来说是无意义的:它并不限制数据的合法范围,只是指定了MySQL交互工具的显示字符宽度而已(比如命令行客户端)。对于存储和计算来说INT(1)和INT(20)是完全等价的。
注:Falcon存储引擎与MySQL AB提供的其他存储引擎有一些不同,它将整数类型存储为它的一个内部格式。用户实际上没有控制存储大小的权力。第三方存储引擎,如Brighthouse,同样也有自己的存储格式以及压缩策略。
3.1.2. 非整数
非整数是带有小数部分的数。然而,他们不止用于表示小数,你也可以使用DECIMAL来存储一些无法在BIGINT中放在的整数。MySQL同时支持精确和非精确两种类型。
FLOAT和DOUBLE类型支持标准的浮点数近似计算规则。如果你需要知道浮点数具体是如何计算的,你可以去调研一下你所使用的系统的浮点数实现方式。
DECIMAL类型用于存储精确小数的。在MySQL5.0及以上版本中,DECIMAL类型支持精确数学计算。MySQL4.1以及早期的版本使用浮点数来进行DECIMAL类型的一些计算,这会由于精确的原因而给出一些很奇怪的结果。在这些版本的MySQL中,DECIMAL只是一个存储类型而已。
浮点数的DECIMAL类型都需要你指定精度。对于一个DECIMAL列来说,你可以指定小数点前和小数点后数字的最大长度。这将会影响数据列的空间消耗。MySQL5.0以其以上版本中会将数字存储为一个二进制字符串(每4 bytes 9个数字)。比如DECIMAL(18,9)可以存储小数点前9位和小数点后9位,共需要9个byte的存储空间:4个用于小数点前的数字,4个用于小数点后的数字,还有一个用于小数点本身。
一个DECIMAL类型的数字,在MySQL5.0及其以上版本中最多可以存储65个数字。早期的版本中有254个数字的上限,并且将这些数字以明文字符串的方式存储的(即一个数字一个byte)。然而,这些版本的MySQL也不能使用这么大的数字来进行计算,因为DECIMAL只是一个存储格式而已,一般用于计算时会将DECIMAL转为DOUBLE来进行。
你可以为一个浮点数类型的列通过好几种方式来指定精度,MySQL会在存储数字时将会色隐式的将数字存储为了一个不同的类型或者近似为另外一个数。这些精度的指定是非标准的,因此我们建议你指定你想要的数据格式而不是仅仅指定一个精度。
浮点数据类型一般会比DECIMAL类型使用更小的空间来表示相同范围的数字。一个FLOAT型的列使用4个byte来存储。DOUBLE使用8个byte,而可以表示更大精度以及更大范围的数字。与整数类型一样,当你选择浮点型时,MySQL会以DOUBLE类型来作为内部计算类型。
由于额外存储空间以及计算消耗,你应该只在你需要存储精确的小数时再使用DECIMAL类型,比如存储财务数据。