【问题标题】:MySQL datatype with many options具有许多选项的 MySQL 数据类型
【发布时间】:2014-11-27 08:03:52
【问题描述】:

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

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

请帮忙!

【问题讨论】:

  • 许多专家建议不要使用 ENUM。如果要确保值在给定集合中,请创建一个列出所有值的表,并将其作为该表的外键。

标签: php mysql enums


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    列的合理选择是最能反映其将保存的数据的列。那几乎不是ENUM

    【讨论】:

      猜你喜欢
      • 2015-02-27
      • 1970-01-01
      • 2012-10-10
      • 2011-10-01
      • 2015-04-05
      • 1970-01-01
      • 2018-10-09
      • 1970-01-01
      • 2013-10-04
      相关资源
      最近更新 更多