用于存储年份的 MySQL 类型:Smallint 或 Varchar 或 Date?
Posted
技术标签:
【中文标题】用于存储年份的 MySQL 类型:Smallint 或 Varchar 或 Date?【英文标题】:MySQL Type for Storing a Year: Smallint or Varchar or Date? 【发布时间】:2010-10-11 07:10:43 【问题描述】:我将在 mysql 表中存储一年:将其存储为 smallint 还是 varchar 更好?我认为由于它不是一个完整的日期,日期格式不应该是一个答案,但我也会包括在内。
小?变量(4)?日期?还有什么?
例子:
2008
1992
2053
【问题讨论】:
【参考方案1】:我自己的经验是使用 Oracle,它没有 YEAR 数据类型,但我一直试图避免仅仅因为元素仅由数字组成而对元素使用数字数据类型。 (因此这包括电话号码、社会安全号码、邮政编码,作为其他示例)。
我自己的经验法则是考虑数据的用途。如果您要对其执行数学运算,则将其存储为数字。如果您将执行字符串函数(例如“获取 SSN 的最后四个字符”或“将电话号码显示为 (XXX) XXX-XXXX”),那么它就是一个字符串。
另一个线索是要求将前导零存储为数字的一部分。
此外,尽管它们通常被称为电话“号码”,但它们经常包含字母来指示分机号码作为后缀的存在。同样,标准书号可能以“X”结尾作为“校验位”,而国际标准序列号可以以“X”结尾(尽管 ISSN 国际中心反复将其称为 8 位代码@ 987654321@).
在国际环境中电话号码的格式设置很棘手,当然,符合 E.164 要求国家/地区呼叫代码以“+”为前缀。
【讨论】:
我不同意这一点,电话号码被称为号码是有原因的,它只包含数字。你如何向用户呈现数字,与你如何将它保存在数据库中无关,它应该只包含数据,而不是格式字符。【参考方案2】:我会使用 YEAR(4) 列类型...但前提是预期年份在 1901 和 2155 范围内...否则,请参阅 Gambrinus 的回答。
【讨论】:
好吧,完全错过了这种类型,我感到很愚蠢。谢谢 它不是一个广泛使用的类型。与较小的 int 类型相比,它的唯一优势是您可以在其上使用日期函数。 因为它只有一个字节宽,它只支持'1901'到'2155'范围内的年份 @Paul:确实如此……我现在已经在回答中指出了这一点。 @Paul:我相信 MySQL 会在此之前更新以避免 Y2.155K 错误——我希望如此。无论哪种方式都值得关注。【参考方案3】:我会选择 small-int - 据我所知 - varchar 会占用更多空间和日期。第二个选项是日期。
【讨论】:
更不用说小的 int 会更快地排序。 对于那些使用 Laravel(或 Lumen)Eloquent 的人来说,这似乎是唯一的选择。以上是关于用于存储年份的 MySQL 类型:Smallint 或 Varchar 或 Date?的主要内容,如果未能解决你的问题,请参考以下文章
MYSQL 字段类型之TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT
单个数字的 Mysql 数据类型 - tinyint(1) 或 smallint(1) 或 int(1)