1 char varchar text的选择
原则,最通用的并不是最适合的。
因为更改数据类型会耗费很长的时候,在定义的时候需要谨慎
例如存放密码的MD5加密数据,那么我们就绝对用char(32) 因为char使用固定的block,具有更快的偏移速度。例如存放用户名这样的数据,长的用户名最多也就25位吧,短的也3位以上,相差不大,我们也用char
但如评论这些,就建议用varchar,以免浪费磁盘空间。一般的评论都不会多于 255个单位字,那些神奇的长评论超出字数让他们分开两贴评论吧。
文章内容建议用text了,因为它很多时候超过255字节了。
ps:有些引擎不支持text 如 memory
2 varchar(255)和varchar(5)的选择
原则:慷慨不是程序员的美德.
在改变数据长度限制是非常轻松的,不会造成长时间耗费,因此能小则小,在发现不够用时候再按需要增大。
对于磁盘来说,varchar(255)和varchar(5)存放‘joffe’数据块占用的大小是一样的,但更大的数据类型大小却带来更大的内存占用。
另外说明一点,这个数字是表示最大字数,不是字节数 在utf-8下1就代表3字节,GBK下1就代表2字节。
3 int(10)与datetime类型的选择
原则:平衡开发速度与机器性能。
我更倾向于int(10)UNSIGNED,因为它方便。但对于数据库来说,int(10)占用的空间和内存都比datatime稍微大。 int(10)可以直接存放linux时间戳 在php里面直接time()就可以,而且可以根据需求用date()函数格式成任何自己喜欢的输出形式。不过从数据库的角度,datetime更节约机器资。
补充说明一下 int(1)和int(11)占用的磁盘空间都是一样的
4尽量NOT NULL
原则:色即是空,空即使色,人不要太色,数据不能太空。
null 的话 其实会在每个数据都加上了1bit的标记。如果char varchar text等 建议用”来做默认而Not Null ,int tinyint等 建议用0做默认而Not Null
5、用int类型存放IP
原则:看清事实本质类型。
有些人用varchar(15)来放,这实在是浪费的,IP本来就是整数,32bit的整数 int(10)存放也就不错。我也见过有人用char(4)存放,把ASCII码全用上了,这种极致的追求也相当不错,不过mysql提供inet_aton()和inet_ntoa转换ip和int类型,而php也有ip2long和long2ip,从开发角度来说,还是建议用int(10),另外说一句,char的大小是跟编码有关系,在国内用char(4)反而增大了机器负担。当然我更建议用php的 ip2long()和long2ip() 顺带说提提ip2long有个bug–ip比较大时候就会变负数,解决方法是先转二进制再转回10进 — bindec( decbin( ip2long( ‘IP地址’ ) ) );
6.char(0) Null 与tinyInt(1)模拟boolen之间争夺
原则:过犹不及,请避免麻烦。
本来char(0) Null 是模拟boolen最好的,因为只有‘’和NULL两种可能,在机器性能方面达到极致!但可恶的PHP是弱类型,在NULL和”之间有很多共通点,一不小心就中招了,在判断方面引来很多麻烦,现在写php的大多是团队合作,某人不中招不代表人人不中。因此为了避免麻烦 还是推荐用tinyInt(1),这个也是mysql推荐的做法。char(0) Null 这就是单方面追求性能而导致麻烦。