在mysql中存储短号的最佳方法

时间:2009-09-03 21:09:55

标签: php mysql

我正在尝试修复其他人编码的项目,这是一团糟!

在编辑用户个人资料页面上,他们有类似下面的内容,其中列出了用户可以为教育级别选择的选项的所有可用无线电选择框,这只是1个项目,有很多项目喜欢这样基于这里的答案,我可以将它应用于此代码的许多其他功能。

他们在许多个人资料字段中使用了数组,它会存储可能的答案,但在这种情况下,用户只能选择1个答案。所以对于教育来说,有7个可能的答案和一个对应的数字,数组中的数字存储在一个mysql数据库中,它们将这1个数字存储为varchar 255长度,这可能不是很好。

我应该将它存储为长度为1的varchar还是使用枚举并列出7个选项或其他内容?

教育

<?PHP
// Array of possible education profile selections
$arr_education[1]="No Answer";
$arr_education[2]="High school";
$arr_education[3]="Some college";
$arr_education[4]="In college";
$arr_education[5]="College graduate";
$arr_education[6]="Grad / professional school";
$arr_education[7]="Post grad";

// shows the array above as checkboxes on a form
foreach($arr_education as $ind=>$val) {  
    echo '<input type="radio" name="education" value="' .$ind. '" ' if($education==$ind){ echo "checked";}. '>' .$val. '<br>';
}



//on a users profile page there would be something like this
$education = 7; // seven would be Post Grad from our array above
echo $arr_education[$education]

//Now here is the mysql table, they chose to use a varchar(255) which seems retarded, using the above code, the max result would be 1 charachter long
education   varchar(255)

?>

5 个答案:

答案 0 :(得分:3)

为什么不使用 TINY INT ?如果答案是&lt;它将更适合您的需求。 255 :)我的测试显示它在索引和选择方面比varchrars更快。

答案 1 :(得分:3)

如果这是一个新项目,我建议使用ENUM。它节省空间(实际上存储在1个字节上)并且易于使用。但是,如果您必须支持遗留代码,那么我建议坚持使用原始数字并将该列更改为TINYINT。

此外,我建议使用常量替换PHP源代码中的数字,这样您就不必猜测代码的作用。例如:

define('EDU_NO_ANSWER', 0);
define('EDU_HIGH_SCHOOL', 1);
define('EDU_SOME_COLLEGE', 2);
// etc...

if ($education >= EDU_SOME_COLLEGE)
{
    // student went to college, but you didn't need that
    // comment to know that
}

答案 2 :(得分:1)

为此,varchar(1)将占用与varchar(255)完全相同的空间,除非枚举达到两位数,varchar(1)将会中断。 &lt; = 255 max chars的varchar字段为字符串的长度存储1个字节,然后是字符串。因此,对于一位数字,varchar(255)需要2个字节。

为什么他们没有使用其中一个整数类,但是,超出我的范围。

答案 3 :(得分:1)

如果可能的项目不会经常更改,那么您应该使用ENUM,它是最节省空间的,并且还使您的所有查询比在其他地方定义的幻数更具可读性。

答案 4 :(得分:0)

如果是我,我会在其中创建一个包含配置文件的单独表,然后使用SQL查询的结果填充Select标记。使索引成为一个整数(毕竟你永远不知道它会变成什么......)它还允许最终用户更改描述而不必触摸代码(假设他们有SQL访问权限)

相关问题