Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 标记列,Varchar还是INT?_Php_Mysql - Fatal编程技术网

Php 标记列,Varchar还是INT?

Php 标记列,Varchar还是INT?,php,mysql,Php,Mysql,我经常在我的数据库中使用(我称之为)“flag”列,例如: Column 'Type': 0 = CREATOR 1 = OPERATIVE 2 = APPROVER 但这是正确的方法吗?我之所以问这个问题,是因为当我不记得零、一、二、三是什么意思的时候,以后再讨论这个问题可能会让人困惑。简单地将它们标记为CREATOR等不是更好吗 一般公认的做法是什么?标志通常是布尔值true和false或0和1,用位(MySQL 5.0.3+)或tinyint表示。如果您有两个以上的可能值,那么这些值可

我经常在我的数据库中使用(我称之为)“flag”列,例如:

Column 'Type':
0 = CREATOR
1 = OPERATIVE
2 = APPROVER 
但这是正确的方法吗?我之所以问这个问题,是因为当我不记得零、一、二、三是什么意思的时候,以后再讨论这个问题可能会让人困惑。简单地将它们标记为
CREATOR
等不是更好吗


一般公认的做法是什么?

标志通常是布尔值
true
false
0
1
,用
位(MySQL 5.0.3+)或
tinyint
表示。如果您有两个以上的可能值,那么这些值可以存储在MySQL中的
ENUM
,否则,这些可能值应该存储在它们自己的表中,并使用外键关系(规范化)进行引用。

最好使用
int
/
tinyint
。并始终使用
注释
,这将帮助您记住所有值是什么

数值在短路和比较方面更好


枚举可以是一个选项。但枚举值的常见问题是,如果您的标志在增加,那么它就有点难以管理

在索引方面,整数优于字符串。

但是您可以有另一个表,该表仅存储
角色
,其中包含
INT role\u id主键
唯一的VARCHAR角色列
。然后,在
user\u roles
中,将
user\u id
role\u id
作为指向
角色的
外键

  • 这样,角色保持
    INT
    ,但可以
    加入
    角色
    表以获取其名称
  • 当您需要使用
    角色
    文字时,您可以从
    角色
    表中查询
    角色id
这是正常化。


PS:但根据用户群的不同,这可能有些过分。使用
索引的VARCHAR角色列

不要使用VARCHAR,可能会更容易。VARCHAR仅对大于3的字符串有效

在本例中,您可以使用CHAR(1)并使用C、O和A的值作为提示

另一种消除代码记忆的方法是定义库函数,告诉您它是什么,例如:

function isCreator($value) {
  if($value === 0) return true;
}

好问题。

您的问题的答案可能是“枚举类型”,如下所述。这些允许您将字符串与数值关联为MySQL中的一种类型,这在“真实”编程语言中很常见

但是,通常情况下,您不想这样做,因为您特别想要对象的引用表。通常,名称在关系术语中是一个“实体”。这意味着要有一张桌子:

create table OperatorType (
    OperatorTypeId int auto_increment primary key,
    Name varchar(255)
)
在这种情况下,所有引用都将指向表中的id,该id将是一个整数


不鼓励使用没有枚举类型或引用表的id。大概,
名称
的目的是使输出具有可读性。您不希望不同的查询(和查询编写器)为运算符类型发明自己的名称。相反,使用内置的数据库机制来正确处理这种情况。

我总是使用tinyint。它比varchar占用更少的空间,并且在速度和索引方面都要好得多。我知道很多人使用enum,虽然我喜欢这个想法,但我更喜欢tinyint的灵活性。现场评论也是一个很好的工具,在今后的工作中会非常有帮助


除了我知道我在存储二进制是/否值的情况外,我总是使用大于零的值。从长远来看,这可以避免很多混乱,因为PHP的计算结果为零和false完全相同(这是从web表单收集值的一个大问题)。

是的,您可以使用int作为列“type”的数据类型 至于您担心以后会忘记0,1,2代表什么,您可以随时以表列注释的形式提供描述

您可以通过执行以下alter查询来更改字段并向其添加注释:

ALTER TABLE `table_name` CHANGE `Type` `Type` INT( 2 ) NOT NULL DEFAULT '0' COMMENT '0 is CREATOR, 1 is OPERATIVE,2 is APPROVER'
我希望这能有所帮助。

试试这个

make your type column a enum field and set the value like '0','1','2' 

在“注释”字段中写为0=创建者,1=执行者,2=批准者。这将帮助您在一年后查看数据库时记住这些值

<代码> VARCHAR 是在这种情况下使用的最坏的类型,正如其他提到的,您可以考虑<代码> EnUM < /C>,<代码> INT/COM>或具有角色的关系表。p> 区别在于:

使用
ENUM
插入记录时,可以使用文字和数字作为值。 再次选择时,您可以在
中同时使用文本和数字,其中
返回的值将是字符串,如果您想获取数字,则必须在字段列表中选择
列名称+0

使用
INT
时,只能使用数字

所以听起来好像
ENUM
应该更好,而且如果您创建一些静态常量来保存代码中的数值,一切都会变得更简单

现在关系是否比枚举更好

如果您需要灵活性,并且想从PA关系表中添加新的角色,则是唯一需要考虑的解决方案。


如果您的角色是固定的,并且永远不会改变,那么不需要加入联接,枚举就更好。

创建另一个表?当PHP本能地知道值是什么时,创建另一个表只是为了记住值似乎很愚蠢。@Chud37它允许您在脚本中不硬编码值的情况下进行缩放。一点也不傻。。。对于大型站点。@Chud37“本能地”?从什么时候起PHP代码就有了直觉?@Chud37如果你理解规范化原则,这一点都不傻。为什么?
enum
的要点是,您可以为不同的有效值指定适当的名称。如果您有时将数字字符串名作为数字传递,有时则作为字符串传递,那么为枚举指定数字字符串名是非常糟糕的。请参见中的