现 在很多人开发网站使用的程序是PHP+mysql,在建立数据库的时候,不仅要考虑到数据库字段的全面性,我们还要考虑到表的字段类型设置的合理性,因为 一个数据库对表的设计没有要求的话,会很浪费数据库的,当然如果你说你的数据库足够大,那你对字段的设置也需要了解一些内容,它可以让你更灵活的写程序。
其实,我以前也没怎么注意过数据库字段的设置,遵循一套老办法,是数字类型的就用int类型,是字符串类型的就用varchar类型,是文本的就用text类型,呵呵,当今天在CSDN上看到一个问题,让我对字段类型的选择又有了重新的定义。
CSDN上的问题是这样的:
在数据库里记录时间,是用datetime好还是用时间戳好?
我第一反应就是datetime是什么类型?我知道时间戳是一串数字,可以用php函数对这串数字处理,来变成各样的时间类型,比如2011-06-20或者06/20/2011等。对已datetime真的很陌生,只有请教下google了。
网络的解释是这样的:
一 个日期和时间组合。支持的范围是’1000-01-01 00:00:00′到’9999-12-31 23:59:59′。MySQL以’YYYY-MM-DD HH:MM:SS’格式来显示DATETIME值,但是允许你使用字符串或数字把值赋给DATETIME的列。
对于上面的问题,CSDN论坛上面的又一个网友的回答我感觉还是蛮好的:
“如果你不打算将你的程序用于其他数据库的话,用 datetime 好。
这样可以方便的使用数据库提供的丰富的日期时间函数
否则用 int 类型保存 unix 时间戳比较好。
因为各种数据库提供的日期时间函数是不同的,很难在 sql 指令中协调起来
对于日期时间的计算只能借助 php 了”
对于datetime类型的数据可以用sql函数处理,我也没去探究,我知道的sql函数少之又少,如果大家想搞的更明白还是亲自建个数据库试试。
在这里我们探讨的是怎么设置字段类型,时间类型的我们说过了,我们就说说其他类型,比如我建一个班的学生数据库表。首先这个表应该包括以下这些字段
id 学生的id 这个设为主键
name 学生的姓名
sex 学生的性别
ok,现在我们就来探讨下,id的类型,因为这是一个数字类型,我们会想到int,但是有没有更好的呢?可能你对smallint tinyint 等其他的类型不熟悉,我们还是先看下网了解释
TINYINT[(M)] [UNSIGNED] [ZEROFILL]
一个很小的整数。有符号的范围是-128到127,无符号的范围是0到255。
SMALLINT[(M)] [UNSIGNED] [ZEROFILL]
一个小整数。有符号的范围是-32768到32767,无符号的范围是0到65535。
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]
一个中等大小整数。有符号的范围是-8388608到8388607,无符号的范围是0到16777215。
INT[(M)] [UNSIGNED] [ZEROFILL]
一个正常大小整数。有符号的范围是-2147483648到2147483647,无符号的范围是0到4294967295。
看到上面的这些内容,我们是否会考虑使用tinyint呢,因为一个班人数不会超过100人,如果使用int不是大材小用嘛!
所以,我们熟悉这些类型的范围后可能会设计出更合理的类型。当然你也可以使用int(3),MEDIUMINT(3)等都可以。
另外要说的是,name类型,一般我们会使用varchar类型,varchar类型会根据你字符串的大小自动扩张和收缩,看样子不错,但是什么时候使用char类型呢?在这里给大家推荐一篇文章 “varchar和char之争”相信读完这篇文章大家可能会对varchar和char的使用更加明确。
关于更多的类型使用,还是需要大家在项目中多多总结得来的,另外不要忘了查看下mysql手册哦。