在MyL中存储日期时应该使用DATE还是VARCHAR?

2021-02-11 16:06

简单地说,我在Orders表上有日期和时间属性。这些属性的数据类型是MyL的DATE属性。但是每次我在PHP中回显日期和时间时,它只会给我一个字符串,而不是一个日期对

解答动态

  • 我不理解为什么会存在日期数据类型s
    总是将日期值存储在日期字段中。
    当您检索这些值时,PHP返回的是日期值的字符表示形式,但在数据库中,您可以(而且应该)对日期字段执行日期操作,而这些操作在字符串中是无法有效执行的。
    例如,让我们看一些类似的操作条目:
    选择字符\日期,表1中的日期按字符日期排序;+-----------+-----------+

    • 字符日期

      • 日期

        • 日期

          • +----------------+----------------+

            • 2021年3月1日

              • 2021年3月1日

                • 2021年2月12日

                  • 2021年2月12日

                    • 2021年1月23日

                      • 2021年1月23日

                        • +----------------+选择表1中的字符

                          • 日期、日期

                            • 按日期排序;+-------------+-------------+

                              • 字符日期日期日期日期日期日期2021年1月23日2021年2月12日2021年2月12日2021年3月1日2021年3月1日见区别?
                                由于应用程序往往对字符数据的输入方式应用较少的控制,字符数据很快就会变得非常混乱,甚至更难处理解释。为例如,“01/04/07”是什么时候?1月4日?四月一日?2001年4月7日?这取决于你在世界的哪个角落!
                                好的,您可以说您的应用程序将把输入的、字符表示的日期值转换成正确的日期,并存储格式一致的[字符]版本,但是,一旦您开始对这些值进行日期操作,您的数据库就必须开始动态地进行日期转换,这可能非常慢。
                                使用正确的工具完成正确的工作…

                                • 在编程中,我们总是在抽象和压抑中工作表述:文本字符串2021-02-09 12:47:14是特定时间点的表示整数1612874834是同一时间点的不同表示这两个最终都将以二进制形式表示;文本字符串已经是一种抽象,可以节省我们的思考关于这个事实 ,我们可以相对容易地在这些和许多其他表示之间进行转换,但是我们也希望能够对它们执行操作:获取输入、显示输出、排序日期、查找两个日期之间的天数等等。
                                  对于这些,我们希望使用适当的抽象-我们不想为它们编写一堆二进制逻辑代码每次操作,我们都要建立可读的代码。对于用户的输入和输出,“日期”的抽象是一个匹配某种模式的文本字符串,这是一个有用的方法一个。不过,可能有许多这样的模式,这取决于上下文—美国的用户希望以“月/日/年”格式查看和输入日期,世界其他地方的用户将需要“日/月/年”;。因此,我们立即需要一个表示日期的中立抽象,而不仅仅是存储用户的输入直接。为了找出两个日期之间的天数,我们需要一个更高层次的抽象,它不是关于日期看起来像什么,而是它代表什么。 对作业使用错误的抽象会导致不必要的复杂代码。它还可能导致错误,例如,如果您将所有日期作为字符串传递,并且不小心传入了格式不正确的内容,您可能会得到“垃圾输入,垃圾输出”,而不是一个明确的错误。因此,在可能的情况下,您应该用更高级别的抽象来表示所有内容。对于date-time值,这意味着PHP中的datetimeimmummable对象和MyL.
                                  中的DateTime列存在一个不幸的障碍:在向数据库发送数据或从数据库发送数据时,需要它处于双方都能理解的表示形式中。大多数数据库驱动程序使用“最小公分母”方法,其中表示是文本字符串。一旦你从数据库中得到了这个字符串,你就可以并且应该把它转换成PHP的DateTimeImmutable类型,这样你就有了使用它的最佳抽象。

                                  • 但是每次我在PHP中回显日期和时间时,它只会给我一个字符串,而不是一个日期对象。
                                    这基本上只是DB access库的一个怪癖。归根结底,所有数据都可以简化为字符串,DB access库只需要在数据库数据类型和编程语言的数据类型之间进行转换。
                                    为什么会存在日期数据类型如果可以随意地将日期对象存储为VARCHAR在DB
                                    中,则可以将日期存储在VARCHAR列中,也可以在VARCHAR列中存储非日期。数据库为列提供了数据类型以强制数据验证,当您使用日期列时,您知道该列不可能包含日期以外的任何内容,因此您可以简化应用程序逻辑,这样就不必担心包含无效数据。另外,datatypes允许数据库使用特定于数据类型的函数,这允许您构建更复杂的操作,如涉及列的aggregate/group-by查询。如果需要为报告编写聚合查询,如“查找按星期几分组的事务总数”;。您将需要使用数据库日期/时间函数,因为将整个表加载到PHP以便使用PHP日期函数解析日期将非常慢,并且您不能将这些用作子查询的中间结果。
                                    数据类型是数据加验证和操作。
                                    理论上,您只需要varchar类型来存储任何数据但是你必须自己在应用程序代码中处理所有的验证和操作,这将使编写性能查询变得更加困难。每个字符是一个VARCHAR,每个VARCHAR是一个字节。这意味着你的VARCHAR日期至少是日期的2.67倍。3.33如果包括分离器。如果字符串日期不是格式化的数字集,则会更大。这不是很大的问题,也可能不是磁盘空间的问题。但是对于内存中的空间,当您需要获取或排序数据时,它会累加起来。
                                    Data integrity
                                    如果有人试图插入一个日期为'Duodecary 32nd 1999'(甚至是格式化的1999/14/32),则日期字段将不允许它。它会抛出一个正确的错误。你的VARCHAR字段不会这样做,这意味着你需要针对这种可能性进行编码,你需要保证任何其他曾经针对数据库进行编码的人也会这样做。你在为自己制造潜在的问题或更多的工作。通常都是。
                                    此外,根据VARCHAR的最大长度,您可能会得到字符串截断错误,或者如果您抑制这些错误,则会得到坏数据。除非您的VARCHAR比需要的长,否则在这种情况下,您的大小问题可能会更糟。
                                    simplicity
                                    这在其他答案中提到,但值得重复。有许多函数处理日期数据类型。增加一定的时间。确定差异。转换为其他语言(英语/西班牙语/法语,而不是C#/JavaScript/PHP)。转换为其他日期格式。对于VARCHAR,这些不存在。意思是你要么自己动手,要么首先把VARCHAR转换成日期。这既是额外的周期,也是你每次需要操纵日期时需要记住的东西。明白吗另外:
                                    https://stackoverflow.com/questions/4759012/when-使用varchar和date时间https://dba.stackexchange.com/questions/208716/which-column-is-better-to-be-used-here-varchar-or-datetime/208724
                                    , 最后我想补充一点。您永远不应该基于您用来访问数据库的编程语言来设计数据库。您应该根据您的数据和适当的数据库设计标准来设计数据库。下周你可能会改用Ruby或Typescript。或者其他人可能需要访问不使用PHP的数据。一个好的数据结构比改变数据以满足语言或库的需求更好。但是,使用日期和时间的数据类型并使用它们是有原因的。
                                    根据日期排序(无论如何可能有效,但取决于您对文本表示的决定)计算:两个日期之间间隔了多少天1对我来说最重要的是,web应用程序可能同时有需要不同表示的用户。我个人喜欢2021-02-10,有些喜欢2021年1月10日。对于实际用户所期望的,将需要转换例程。这是混乱的,但有助于标准例程可用于日期类型。同样,我更喜欢24小时制,而另一个用户可能更喜欢AM/PM(在我的语言区基本上是闻所未闻的)。这个区域有时被称为I18N,在国际化中缩短了18个字符,是一个著名的抽屉,里面装满了问题。

                                    • 取以下字符串:quot;。那是什么日期?2002年12月1日?2012年1月2日?还有别的吗?这实际上取决于你生活在世界的哪个地方。
                                      因此,你真的需要将日期存储为日期,而不是字符串。正如其他人所提到的,它也有助于对日期值执行操作,但原因之一是它可以帮助程序员更容易地阅读代码,并且不会引入错误。

                                      • End

                                      免责声明:

                                      本页内容仅代表作者本人意见,若因此产生任何纠纷由作者本人负责,概与琴岛网公司无关。本页内容仅供参考,请您根据自身实际情况谨慎操作。尤其涉及您或第三方利益等事项,请咨询专业人士处理。