Sql 何时使用VARCHAR和日期/日期时间
我们在Freenode上进行了编程讨论,当我试图使用VARCHAR(255)以以下格式存储日期变量时,出现了这个问题:D/MM/YYYY。所以问题是为什么使用VARCHAR来存储日期这么糟糕。以下是优点:Sql 何时使用VARCHAR和日期/日期时间,sql,date,Sql,Date,我们在Freenode上进行了编程讨论,当我试图使用VARCHAR(255)以以下格式存储日期变量时,出现了这个问题:D/MM/YYYY。所以问题是为什么使用VARCHAR来存储日期这么糟糕。以下是优点: 编写代码更快。以前我使用日期,但日期格式真的很麻烦 使用字符串比使用日期更耗电?谁在乎呢,我们生活在这个时代 这在道德上是不正确的(lolwut?)这是其他用户告诉我的 那么,您希望使用什么来存储日期呢?SQL VARCHAR或SQL DATE?两个原因: 按日期对结果进行排序 对日期格式更
- 按日期对结果进行排序
- 对日期格式更改不敏感
5/12/1999 | Frank N Stein
1/22/2005 | Drake U. La
10/4/1962 | Goul Friend
1/22/2005 | Drake U. La
10/4/1962 | Goul Friend
5/12/1999 | Frank N. Stein
10/4/1962 | Goul Friend
5/12/1999 | Frank N. Stein
1/22/2005 | Drake U. La
如果我们按您的方式存储数据,但按批准顺序排序,SQL将以如下所示的结果集进行响应:
5/12/1999 | Frank N Stein
1/22/2005 | Drake U. La
10/4/1962 | Goul Friend
1/22/2005 | Drake U. La
10/4/1962 | Goul Friend
5/12/1999 | Frank N. Stein
10/4/1962 | Goul Friend
5/12/1999 | Frank N. Stein
1/22/2005 | Drake U. La
如果我们将日期存储为DATETIME,SQL将按照如下顺序正确响应:
5/12/1999 | Frank N Stein
1/22/2005 | Drake U. La
10/4/1962 | Goul Friend
1/22/2005 | Drake U. La
10/4/1962 | Goul Friend
5/12/1999 | Frank N. Stein
10/4/1962 | Goul Friend
5/12/1999 | Frank N. Stein
1/22/2005 | Drake U. La
此外,如果您需要以不同的格式显示日期,例如YYYY-MM-DD,那么您需要转换所有数据或处理混合内容。当它存储为SQL日期时,您必须在代码中进行转换,并且很可能有一个点可以更改格式以显示所有日期——免费
为什么不用锤子把螺丝钉钉进去呢
因为它不是适合这项工作的工具
VARCHAR版本的一些缺点:
- 您无法轻松地向VARCHAR版本添加/减去天数
- 仅提取月/年是比较困难的
- 没有什么可以阻止您将非日期数据放入数据库的VARCHAR列中
- VARCHAR版本是特定于区域性的
- 你不能轻易地把日期分类
- 如果您以后想更改格式,则很难更改格式
- 它是非常规的,这将使其他开发人员更难理解
- 在许多环境中,使用VARCHAR将占用更多的存储空间。这对于少量数据可能并不重要,但在具有数百万行数据的商业环境中,这可能会产生很大的影响
当然,在你的爱好项目中,你可以做你想做的事。在专业环境中,我会坚持使用合适的工具来完成工作。在
DATE/DATETIME
和VARCHAR
之间,我每次都会选择DATE/DATETIME
。但还有一个被忽视的第三选择。将其存储为无符号整数
在我的上一个项目中,我决定使用无符号整数
,我真的很满意这样的选择,而不是将其存储为日期/日期时间
。因为我在客户端和服务器之间传递日期,所以它是我使用的理想类型。我不必将它存储为DATE
,也不必每次选择时都转换回来,我只需选择它,然后按我想要的方式使用它。如果要将日期选择为“人类可读”日期,可以使用FROM_UNIXTIME()
函数
此外,整数占用4个字节,而DATETIME
占用8个字节。节省50%的存储空间
Berin提出的排序问题也可以通过使用integer作为日期存储来解决。当您的数据库中有超过200-300万行时,您就会知道为什么使用DATETIME比使用VARCHAR更好:) 简单的答案是,对于数据库,处理能力不再是问题。只是数据库的大小取决于硬盘的寻道时间 基本上,使用现代硬盘,如果以随机顺序(通常是这种情况)读取记录,您可以每秒读取大约100条记录,因此您必须尽一切努力最小化数据库大小,因为:
- 硬盘驱动器的磁头不需要“旅行”这么多
- 您将在RAM中容纳更多数据
对于VARCHAR,您不能进行任何搜索。如果您如此讨厌SQL处理日期的方式,只需在32位整数字段中使用unix时间戳即可。您将(基本上)拥有使用SQL日期字段的所有优点,您只需使用您选择的编程语言(而不是SQL函数)操作和格式化日期。为了简单性/一致性,我赞成使用日期/日期时间类型 如果确实将其存储为字符串,请以以下格式存储:
- 日期
- 一天中的时间
- 协调世界时(UTC)
- 偏移到UTC的本地时间
- 日期和时间
- 时间间隔
- 重复时间间隔
- 系统易于读写
- 易于比较和分类
- 语言独立
- 较大的单位写在较小的单位前面
- 对于大多数表示法,表示法很短且长度恒定