设计数据的原则
1.一般情况下,一般选择最小的数据类型,因为他们占用更小的磁盘、内存和缓存。
2.数据类型越简单越好,如存储标志字段的时候,尽量使用整型而不要使用字符型。
3.尽量避免为null,null是列的默认属性,通常情况下最好指定列为not null,但是这个设计对数据库的性能提升较小,调优的时候的优先级可靠后。
整型
1.整数类型有TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT,分别使用8,16,24,32,64位存储空间
2.有符号数和无符号数使用相同存储空间,并具有相同的性能,UNSIGNED不允许为负数,但是可以使整数的上限提升一倍,例如TINYINT的存储范围是-128~127,那么UNSINGED TINYINT的范围为0 - 255。
3.可以为整数型指定宽度,如int(11),但是并不以对数值有任何限制,只是规定一些MySQL的一些交互工具的显示。
字符串类型
1.varchar用于储存可变长字段,它比char定长字段更节省空间,因为它仅仅使用需要的空间。
2.varchar的存储格式:除了需要存储的字段外,还需要使用额外的1个或者2个字节去记录字符的长度。(小于或等于255时,使用1个字节,大于255则使用2个字节)
3.也由于varchar是变长的,在更新的时候,如果长度需要增加时,需要做额外的操作。(INNODB会把过长的varchar存储成blob)
4.varchar在存储和查询时会保留末尾的空格,而char会将末尾的空格剔除掉。
5.char适合存储定长的字段,例如存储MD5加密字段等等。对于非常短的列,例如flag这种标记字段,使用char(1)更好,如果使用varchar(1)则需要两个字节。
6.blob和text是为了存储很大的数据而设计的字符串数据类型。blob存储的是二进制数据,没有排序规则和字符集,而text类型有
7. Mysql不能将blob和text全部长度的字符串进行索引。
日期和时间类型
1.DateTime可以存储更大范围的值,从1001年到9999年,精度为秒,与时区无关,使用8个字节存储。
2.TimeStamp保存了从1970年以来的描述(只能从1970到2038),它只使用4个字节存储,因此它的范围比DateTime要小。
3.TimeStamp提供的值跟时区有关,DateTime则无关,仅仅存储日期的文本值。
4.TimeStamp默认值为null,可以设置create和update的行为。
特殊数据类型
例如存储IP地址的时候,一般设计为varchar(15)来存储,但是它其实是一个32位的无符号整数,MySQL提供了INET_ATON()和INET_NTOA()来进行转换。