具有许多选项的MySQL数据类型


MySQL datatype with many options

我正在创建一个MySQL表来存储用户信息。如果一个信息是用户的毕业年份,从1970~2014年,最好的数据类型是什么?我希望此值为用户提供在注册时选择毕业年份的选项。
我打算像这样使用枚举。 grdYr ENUM('70','71','72', ... '14'),但MyAQL maual建议不要使用数字作为枚举值。简单地添加这样的角色grdYr ENUM('s70','s71','s72', ... 's14')解决问题吗?

另外,如果我以后要添加更多值,例如 15 年级、16 年级等,随着学生每年毕业,每次更改表格是完成此操作的唯一方法吗?据我所知,这似乎是唯一的方法,但改变表格听起来像是我不应该做的事情。

请帮忙!

首先,您应该使用多个表和外键 insead 的 ENUM 。您还应该以 4 位而不是 2 位数字的格式存储任何年份。因为。。。如果您需要添加 2070 年怎么办?

其次,使用DATETIMEDATE类型的列作为日期。或者,使用 VARCHARINTTINYINT 来表示像 Yours 这样的数字(我仍然更喜欢日期类型)。不要制作仅包含用户毕业年份的表格(甚至单列 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
}

不要使用 ENUM .如果要存储数字,请使用更合适的类型,如 INT ,或者如果您绝对想保留前导零,则至少VARCHAR。如果要存储日期,请使用日期类型之一,例如 DATE 。这使得数据库架构更清晰,因为列类型提供了有关其意图的提示。

我还建议存储完整的 4 位数字年份而不是 2 位数字,因为两位数年份是模棱两可的。请记住:工作代码倾向于继续使用的时间比最初预期的要长。如果您想向访问者显示 2 位数的年份,那就这样做,但仍在您的数据库中存储 4 位数字年份。除非您的桌子很大,否则额外的空间不会成为问题。这是一个微不足道的 UI 问题。

反对ENUM s中的数字的建议是因为它相对没有意义。在每个数字的开头添加"s"并不会使其变得毫无意义。

列的合理选择是最能反映它将包含的数据的列。这几乎从来都不是ENUM.