MySQL数据类型选择mysql
更小的一般更好:通常状况下选择能够正确存储数据的最小数据类型。越小的数据类型一般更快,占用磁盘,内存和CPU缓存更小。git
简单就好:简单的数据类型的操做一般须要更少的CPU周期。例如:整型比字符操做代价要小得多,由于字符集和校对规则(排序规则)使字符比整型比较更加复杂。github
尽可能避免NULL:尽可能制定列为NOT NULL,除非真的须要NULL类型的值。由于可能为NULL列使得索引,索引统计和值比较都更复杂。可为NULL的列会使用更多的存储空间,在MySQL里也须要特殊处理。sql
在选择列的数据类型时须要先选定合适的大类型,如:数字,字符串,时间等。缓存
整数类型服务器
有两种类型的数字:整数和实数。若是须要存储整数,能够选择一下集中数据类型:cookie
数据类型 | 长度/字节 | 范围 | 说明 |
---|---|---|---|
TINYINT | 1 | -2^7—2^7-1 | 整数类型可选UNSIGND属性 |
SMALLINT | 2 | -2^15—2^15-1 | 表示不容许为负值 |
MEDIUMINT | 3 | -2^23—2^23-1 | 这大体可使整数上限提升一倍 |
INT | 4 | -2^31—2^31-1 | 例如UNSIGNED可使TINYINT |
BIGINT | 8 | -2^63—2^63-1 | 存储的范围是0—255 |
*实数类型函数
实数是带有小数部分的数字。然而它们不仅是存储小数部分;也能够是DECIMAL存储比BIGINT还大的整数。MYSQL即支持精确类型,也支持非精确存储。FLOAT和DOUBLE类型支持使用标准的浮点运算进行近似计算。具体计算规则取决于所使用平台的实现。性能
数据类型 | 长度 | 范围 | 说明 |
---|---|---|---|
FLOATR | 4字节 | — | 浮点数 |
DOUBLE | 8字节 | — | 浮点数 |
DECIMAL | 最多65数字(5.0以上版本) | — | 定点数 |
MySQL使用DOUBLE做为内部浮点计算的类型。注意,DECIMAL须要额外的空间和计算开销,因此只要要求尽可能对小数进行精确时才使用DECIMAL,例如在存储财务数据时,能够用BIGINT来替代它来实现,只须要将数据乘以相应的倍数便可。学习
*字符串类型
MySQL支持多种字符串类型。从4.1版本开始,每一个字符串列能够定义本身的字符集和校对规则(排序规则),这些东西会在很大程度上影响性能。
VARCHAR和CHAR类型
VARCHAR和CHAR时最主要的两种字符串类型。
VARCHAR:适用于存储变长的字符串,是最多见的字符串数据类型。它比定常更加节省空间,由于它仅须要使用必要的额外空间(若是MySQL表使用ROW_FORMAT=FIXED建立的话,会使用定长)。
适合使用该类型的状况:字符串列的最大长度比平均长度大不少;列的更新不多,因此碎片不是问题;使用了UTF-8这样复杂的字符集,每一个字符的使用不一样字节数进行存储。
注:5.0以上版本会保留末尾空格,更早的版本会删除末尾空格。InnoDB存储引擎会把过长的VARCHAR转换为BLOB类型。
CHAR:CHAR是定长字符串类型,MySQL老是根据定义的类型进行分配足够的空间。当存储CHAR时MySQL会默认删除行尾空格。由于CHAR值一般须要用空格进行填充以方便比较。
CHAR适合存储很短的字符串,或者全部长度都接近一个长度。
对于常常变动的数据CHAR比较VARCHAR要好,由于定长的CHAR类型不容易产生碎片。
对于更短的列CHAR比VARCHAR要更加节省空间,由于VARCHAR老是须要一个额外的字节来存储长度。
BLOB和TEXT类型
BLOB和TEXT是用来存储很大的数据来设计的字符串数据类型,分别采用二进制和字符方式进行存储。
实际上他们时属于两种不一样数据类型家族:字符类型的时TINYTEXT, SMALLTEXT, TEXT, MEDIUMTEXT, LONGTEXT;对应的二进制类型是TINYBLOB, SMALLBLOB, BLOB, MEDIUMBLOB, LONGBLOB。BLOB是SMALLBLOGB的同义词,TEXT是SMALLTEXT的同义词。
与其余数据类型不一样,它们被看成单独的对象进行处理。当BLOB和TEXT值太大时InnoDB会使用专门的外部区域来进行存储,此时每一个值只须要1—4个字节在行内存储一个指针便可,而后在外部存储区域存储实际的值。
BLOB和TEXT的仅有的区别在于BLOB类型存储的时二进制数据,没有排序规则或字符集,而TEXT类型有字符集和排序规则。
MySQL对BLOB和TEXT列进行排序时与其余类型时不一样的,它只对每一个列的最前max_sort_length字节而不是整个字符串作排序。
MySQL不能将BLOB和TEXT列所有长度进行字符串进行索引,也不能使用这些索引消除排序。
日期和时间类型
MySQL可使用不少类型来保存日期和时间值,例如YEAR和DATE.MySQL能存储最小粒度为秒。可是可使用微秒级的力度进行运算。
MySQL提供了两种类似的数据类型:
DATETIME和TIMESTAMP
DATETIME
能保存1001到9999年,精度为秒。格式为YYYY-MM-DD HH:MM:SS与时区无关,使用八个字节的存储空间。
TIMESTAMP
时间戳,正如名字同样。它能保存从1970年1月1号午夜(格林尼治标准时间)。它只使用四个字节的存储空间只能表示1970到2038年。
TIMESTAMP显示的值依赖于时区。MYSQL服务器,操做系统,以及客户端链接都有时区设置。所以存储值为0时在不一样的时区显示值会有差异。
注:一般状况下应尽可能使用TIMESTAMP,由于它比DATETIME效率更高。若是须要存储更小粒度的时间,能够用BIGINGT或者转换成DOUBLE类型来进行存储。
ENUM数据类型
枚举数据类型在内存中很是紧凑,会根据列表值的数量压缩到一个或两个字节。MySQL自身会维护一个查找表。例如:
CREATE TABLE enum_test(
gender ENUM("男","女","其余") NOT NULL
);
INSERT INTO enum_test values("男","女","其余");
在数字上下文环境检索时能够看到
SELECT gender FROM enum_test;
gender+0 |
---|
1 |
2 |
3 |
注意:枚举时按照内部的数字而不是定义的字符串进行排序的。
mysql> SELECT gender FROM enum_test ORDER BY gender;
gender |
---|
男 |
女 |
其余 |
在不少状况下咱们可使用ENUM类型来替代字符串类型。可是若是不宜使用数字类型做为枚举常量,这种双重性容易致使混乱。枚举最很差的地方就是,字符串列表是固定的,添加或删除字符串必须使用ALTER TABLE。
特殊数据类型
某些类型的数据不直接与内置类型一直。如用BIGINT和DOUBLE来存储低于秒级精度的时间戳。还有就是用一个32位无符号整数存储IP地址。MySQL提供了INET_ATON()和INET_NTOA函数进行两种表示方式之间转换。
INET_ATON(3232235521) ——> 192.168.0.1
INET_NTOA(192.168.0.1)——>3232235521
以上只是常见的数据类型,其余类型就不一一赘述。本人我的博客站点:www.mycookies.cn(适合初级JAVA学习者学), 欢迎你们来指点指点哦。源码地址:https://github.com/liqianggh/blog