我正在创建一个MySQL表来存储用户信息。如果一个信息是用户的毕业年份,从1970年到2014年,那么最好的数据类型是什么?我希望这些值能够让用户在注册时选择毕业年份。
我打算像这样使用枚举。 grdYr ENUM('70','71','72', ... '14')
,但MyAQL maual建议不要将数字用作枚举值。只需添加像grdYr ENUM('s70','s71','s72', ... 's14')
这样的字符就能解决问题吗?
另外,如果我以后要添加更多的数据,比如15年级,16年级等学生每年毕业,那么每次改变表格的唯一方法是什么?据我所知,这似乎是唯一的方法,但改变一个表听起来像我不应该做的事情。
请帮忙!
答案 0 :(得分:1)
首先,您应该使用ENUM
的多个表和外键密钥。您还应该以4位数格式存储任何年份,而不是2位数。因为...如果您需要添加2070年该怎么办?
其次,对日期使用DATETIME
或DATE
类型的列。或者,对{You}这样的数字使用VARCHAR
,INT
,TINYINT
(我仍然会更喜欢日期类型)。不要制作仅包含用户毕业年份的表格(甚至是单个列BY ENUM)。通过HTML / PHP代码验证它。使用特定选项创建<select>
并通过它进行验证。
<强> HTML:强>
<select>
<option value="1970">1970</option>
<option value="1971">1971</option>
<option value="1972">1972</option>
...
<option value="2013">2013</option>
<option value="2014">2014</option>
</select>
<强> PHP:强>
$arrayWithYears = array();
foreach($i = 1970; $i <= 2014; $i++) {
$arrayWithYears[] = $i;
}
if(in_array($iSubmittedValue, $arrayWithYears)) {
// TRUE
} else {
// FALSE
}
答案 1 :(得分:0)
不要使用ENUM
。如果您要存储数字,请使用更合适的类型,例如INT
,或者至少VARCHAR
,如果您绝对想要保留前导零。如果您要存储日期,请使用其中一种日期类型,例如DATE
。这使得数据库模式更加清晰,因为列类型提供了关于其意图的提示。
我还建议存储完整的4位数年份而不是2位数,因为两位数年份不明确。 请记住:工作代码的使用时间往往比原先预期的时间更长。如果要向访问者显示2位数年份,请执行此操作,但仍会在数据库中存储4位数年份。除非您的表格大量,否则额外的空间不会成为问题。这是一个微不足道的UI问题。
针对ENUM
中数字的建议是因为它相对毫无意义。在每个数字的开头添加“s”并不会使它变得毫无意义。
列的合理选择是最接近它将持有的数据的选择。这几乎不是ENUM
。