2009-09-03 48 views
1

我正在修复一个别人编码的项目,这是一团糟!在mysql中存储短数字的最佳方法

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

他们用一个数组的许多个人资料栏,它会存储可能的答案,用户只能选择1分的答案,虽然在这种情况下。所以对于教育来说,有7个可能的答案,数组中对应的数字存储在一个mysql数据库中,他们将这个数字作为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) 

?> 
+0

这与255的最大长度这不是存储号码的好方法,一个varchar但如果需要更少的长度,用得少。 – pavium 2009-09-03 21:14:39

+0

@pavium:当MySQL在内存中创建临时表(例如对结果集进行排序时),它将为每行分配完整的255个字节,就像它是一个CHAR列一样。 – 2009-09-04 00:47:58

回答

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 
} 
1

对于这一点,一个varchar(1)将占据完全一样多的空间,除非枚举曾达到两位数,一个varchar(1)将打破一个varchar(255)。最大字符数为< = 255的varchar字段为字符串的长度存储1个字节,然后为字符串存储1个字节。所以对于一位数字的数字,varchar(255)需要2个字节。

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

3

为什么不使用TINY INT?如果答案是< 255,它更适合你的需求:)我的测试表明它比索引和选择中的varchrars更快。

0

如果是我,我会创建一个单独的表与它的配置文件,然后填充一个SQL查询的结果选择标签。赚了指数的整数(毕竟你永远不知道这是什么会成长为...)这也让最终用户更改说明,而不必触及代码(假设他们有SQL访问)

1

如果可能的项目不会经常改变,那么你应该使用ENUM,它是最节省空间的,并且使得你的所有查询都比在其他地方定义的神奇数字更可读。

相关问题