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

如果一个mysql数据库表要包含两到四个值,我应该使用varchar吗?,mysql,Mysql,我正在为一个新项目创建一个数据库结构,有一个表,其中一个字段在从网站上的选择框中选择时将接收/包含三个值中的一个。这些值将是(打开、挂起、关闭)是否需要将字段设置为varchar类型(某个值),或者是否有更好的方法?还有一些时候,我会有一个字段,它接受两个值中的一个,是或否,我通常只设置varchar(3)类型的字段。我想以正确的方式执行此操作。我可以为这些类型的实例设置哪些其他类型的字段 谢谢 附言: 在表中创建列时,将字段设置为非null的目的是什么?当开发人员没有为所需的字段插入值时,只会

我正在为一个新项目创建一个数据库结构,有一个表,其中一个字段在从网站上的选择框中选择时将接收/包含三个值中的一个。这些值将是(打开、挂起、关闭)是否需要将字段设置为varchar类型(某个值),或者是否有更好的方法?还有一些时候,我会有一个字段,它接受两个值中的一个,是或否,我通常只设置varchar(3)类型的字段。我想以正确的方式执行此操作。我可以为这些类型的实例设置哪些其他类型的字段

谢谢

附言:


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

查看类型。它可以让您拥有一系列的选项,并且通常会因为它而更加高效。

查看类型。它可以让您拥有一组选项,通常效率更高。

理想情况下,我会在那里有一个整数字段,它是另一个表的外键,类似于:

MyTable
    Field1 varchar(10)
    State integer

States
    State integer primary key
    Desc varchar(50)
这将减轻您对数据库中占用过多空间的担忧。另一种解决方案是使用硬编码整数来指定状态,但这会在数据库和应用程序之间引入不必要的绑定

至于您关于使用
“notnull”
的问题,DBMS应全权负责其自身的数据完整性。谁能说应用程序A依赖于一个列不能包含空值的事实,而应用程序B出现并插入了空值(bug、不称职的程序员或任何其他原因)


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

理想情况下,我会在那里有一个整数字段,它是另一个表的外键,类似于:

MyTable
    Field1 varchar(10)
    State integer

States
    State integer primary key
    Desc varchar(50)
这将减轻您对数据库中占用过多空间的担忧。另一种解决方案是使用硬编码整数来指定状态,但这会在数据库和应用程序之间引入不必要的绑定

至于您关于使用
“notnull”
的问题,DBMS应全权负责其自身的数据完整性。谁能说应用程序A依赖于一个列不能包含空值的事实,而应用程序B出现并插入了空值(bug、不称职的程序员或任何其他原因)


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

ENUM('opened'、'suspended'、'closed')
ENUM('opened'、'suspended'、'closed')
我通常在这些实例中使用ENUM


PS-NULL与empty是不同的值

在这些实例中,我通常使用ENUM


PS-NULL与empty不同,TINYINT unsigned通常是更好的字段类型,尽管也可能是
ENUM
。我倾向于避免使用
ENUM
,因为如果还需要对数据库进行更改,那么在代码中推出新值会有点麻烦

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


至于您关于
非空
的问题,是的,这是一种用于帮助确保数据完整性的方法。如果您有远见将其作为表结构的一部分,它将非常有用。

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

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


至于您关于
非空
的问题,是的,这是一种用于帮助确保数据完整性的方法。如果您有远见将其作为表结构的一部分,它将非常有用。

我将如何选择要在选择框中显示的值?如果通过下拉菜单选择了“打开”选项,它是否只是一个常规保存,如“插入到tablename(…)值(…)?我将如何选择要显示在选择框中的值?如果通过下拉菜单选择了“打开”选项,它是否只是一个常规保存,如“插入到tablename”(…)值(…)?有道理,是的,如果我指定了3个值,我在理解enum的工作原理方面有问题。我如何在客户端查看该数据以及将表更新到用户在下拉列表中选择的内容。enum实际上只是存储为int,但int表示为text。因此,与其执行
插入tbl值,不如执行以下操作(0)
使用TINYINT列,您可以将
插入tbl值(“打开”)