如果一个mysql数据库表要保存两到四个值,我应该使用varchar吗?

时间:2009-08-19 02:23:53

标签: mysql

我正在为一个新项目创建一个数据库结构,并且有一个表,其中一个字段将从网站上的选择框中选择时接收/包含三个值中的一个。这些值是(打开,暂停,关闭)是否需要创建varchar类型的字段(某个值)或者有更好的方法吗?还有一些时候生病的人会接受两个值中的一个是yes或no,我通常只设置varchar(3)类型的字段。我想以正确的方式做到这一点,我可以为这些类型的实例设置其他类型的字段吗?

感谢

PS:

在表中创建列时,将字段设置为非空的目的是什么?当开发人员没有为所需的字段插入值时,所有这一切都会显示错误。所有检查都可以在客户端或服务器端完成,它的目的是通过数据库完成吗?它是否只是让开发人员仔细考虑数据输入所需的字段?

5 个答案:

答案 0 :(得分:6)

查看enum类型。它允许您拥有一定数量的选项,因此通常更有效。

答案 1 :(得分:2)

理想情况下,我实际上有一个整数字段,它是另一个表的外键,如:

MyTable
    Field1 varchar(10)
    State integer

States
    State integer primary key
    Desc varchar(50)

这将减轻您在数据库中占用太多空间时可能遇到的任何问题。另一个解决方案是使用硬编码的整数来指定状态,但这会在您的数据库和应用程序之间引入不必要的绑定。

关于使用"not null"的问题,DBMS应该完全负责自己的数据完整性。谁说应用程序A依赖于一个列不能包含NULL并且应用程序B出现并插入它们(bug,无能力编码器或任何其他原因)这一事实?

这可能会破坏应用程序A.控制DBMS中的数据的正确位置是DBMS。

答案 2 :(得分:1)

TINYINT unsigned通常是更好的字段类型,尽管ENUM也是可能的。我倾向于避免使用ENUM,因为如果必须进行数据库更改,在代码中推出新值会有点麻烦。

TINYINT只占用一个字节的存储空间,最多可以表示256个不同的值,而不是存储一个“暂停”的varchar,它占用9个字节,加上一个前缀字节。在这种情况下,我会使用0,1和2分别表示“打开”,“暂停”和“关闭”。同样,ENUM允许您使用文本表示而不是整数,但如果要添加新值,则需要更改列。

关于NOT NULL的问题,是的,这是一种用于帮助确保数据完整性的方法。如果你有远见使它成为你的桌子结构的一部分,这是非常有用的。

答案 3 :(得分:0)

ENUM('opened', 'suspended', 'closed')

答案 4 :(得分:0)

我通常在这些情况下使用ENUM。

PS - NULL是一个不同于空的值