存储年份的MySQL类型:Smallint、Varchar或Date?

存储年份的MySQL类型:Smallint、Varchar或Date?,mysql,database,database-design,optimization,Mysql,Database,Database Design,Optimization,我将在MySQL表中存储一年:将其存储为smallint或varchar更好吗?我想既然不是一个完整的日期,那么日期格式不应该是一个答案,但我也会包括在内 斯莫林?瓦查尔(4)?约会?还有别的吗 示例: 2008年 一九九二年 2053年 我会使用(4)列类型。。。但只有在预期年份在1901年和2155年之间时。。。否则,请参见甘布里努斯的答案。我会选择小int-据我所知,varchar将占用更多的空间和日期。第二个选项是日期。我自己的经验是使用Oracle,它没有年份数据类型,但我一直试图避

我将在MySQL表中存储一年:将其存储为smallint或varchar更好吗?我想既然不是一个完整的日期,那么日期格式不应该是一个答案,但我也会包括在内

斯莫林?瓦查尔(4)?约会?还有别的吗

示例:

  • 2008年

  • 一九九二年

  • 2053年


    • 我会使用(4)列类型。。。但只有在预期年份在1901年和2155年之间时。。。否则,请参见甘布里努斯的答案。

      我会选择小int-据我所知,varchar将占用更多的空间和日期。第二个选项是日期。

      我自己的经验是使用Oracle,它没有年份数据类型,但我一直试图避免对元素使用数字数据类型,因为它们仅由数字组成。(这包括电话号码、社会保险号码、邮政编码以及其他示例)

      我自己的经验法则是考虑数据是用来做什么的。如果要对其执行数学运算,请将其存储为数字。如果您要执行字符串功能(例如“获取SSN的最后四个字符”或“将电话号码显示为(XXX)XXX-XXXX”),则它是一个字符串

      另一个线索是要求将前导零存储为数字的一部分

      此外,尽管它们通常被称为电话“号码”,但它们经常包含字母,表示存在分机号码作为后缀。同样,标准书号可能以“X”结尾作为“校验位”,而国际标准序列号可能以“X”结尾(尽管ISSN国际中心反复将其称为8位代码)


      在国际环境下设置电话号码的格式是很棘手的,而且符合E.164要求国家/地区的电话号码必须以“+”作为前缀。我觉得完全没有使用这种类型很愚蠢。ThanksIt不是一种广泛使用的类型。与较小的int类型相比,它唯一的优点是可以在其上使用日期函数。因为它只有一个字节宽,所以它只支持从“1901”到“2155”的年份@Paul:没错。。。保罗:我相信MySQL会在那之前更新,以避免出现Y2.155K错误——我希望如此。这两种方式都值得关注。更不用说小整数会更快排序。对于那些使用Laravel(或Lumen)雄辩的人来说,这似乎是唯一的选择。我不同意这一点,电话号码被称为号码是有原因的,它只包含号码。如何向用户显示数字与如何将其保存在数据库中无关,数据库应只包含数据,而不包含格式字符。