我正在创建一个MySQL表来存储用户信息。如果一个信息是用户的毕业年份,从1970~2014年,最好的数据类型是什么?我希望此值为用户提供在注册时选择毕业年份的选项。
我打算像这样使用枚举。 grdYr ENUM('70','71','72', ... '14')
,但MyAQL maual建议不要使用数字作为枚举值。简单地添加这样的角色grdYr ENUM('s70','s71','s72', ... 's14')
解决问题吗?
另外,如果我以后要添加更多值,例如 15 年级、16 年级等,随着学生每年毕业,每次更改表格是完成此操作的唯一方法吗?据我所知,这似乎是唯一的方法,但改变表格听起来像是我不应该做的事情。
请帮忙!
首先,您应该使用多个表和外键 insead 的 ENUM
。您还应该以 4 位而不是 2 位数字的格式存储任何年份。因为。。。如果您需要添加 2070 年怎么办?
其次,使用DATETIME
或DATE
类型的列作为日期。或者,使用 VARCHAR
、 INT
、 TINYINT
来表示像 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
.