用于分钟、秒和毫秒的数据类型是varchar还是decimal?

4
我有一个MySQL数据库表格,其中包含越野跑步时间。我现在犹豫不决,是否应该将当前运行时间的数据类型(varchar)转换为十进制数。
吸引我使用varchar数据类型的一个方面是,当通过php脚本解析输入的比赛结果并动态检索时,我无需将其转换为秒,然后再转换回来。我的处理脚本确保每个时间都为8个字符长,除非运动员DNF(未完成),这也是我想存储的信息。 DNF显示为“DNF”在结果中。
那么,应该将运行时间存储为17:40.57还是1060.57?每种方法的优缺点是什么?是否有比我已经认为是正确类型更好的数据类型?
此外,如果您选择1060.57作为答案,那么我如何逻辑地存储DNF或DNS?

能否演示一下你所说的“17:40.57”是什么格式?大多数人会认为它是hh:mm:ss。 - OMG Ponies
对于新用户:在数据库中存储毫秒级时间 - Grijesh Chauhan
2个回答

5

我最初建议使用TIME和DATETIME数据类型,但不知道MySQL不会在任何时间数据类型列(例如:TIME、DATETIME等)中存储微秒

FLOAT显然很差 - 即使MySQL声明它只适用于精度不是问题的情况。

VARCHAR/CHAR并不是一个好主意,因为没有手段强制执行格式的一致性。你可以混合mm:ss:ff和十进制格式 - 两种格式都会被接受,但在显示时显然看起来很奇怪。

鉴于MySQL的限制,DECIMAL将是最佳选择,以确保数据一致性和验证。但这意味着需要自定义功能才能获得不同的格式输出,如果MySQL的时间函数支持足够的精度,则可以使用这些函数。

其他免费的数据库,如PostgreSQL、SQL Server Express或Oracle Express,可能值得考虑作为更好的数据类型支持的替代方案。


我认为小数部分很重要,但它不能存储在TIME中。如果Zen想使用TIME,他需要一个额外的毫秒列。他还需要额外的列来存储DNF和DNS条目。 - theazureshadow
@theazureshadow:十进制只是格式/显示 - 这就是像TIME_FORMAT这样的函数存在的原因。 - OMG Ponies
@OMG_Ponies:从文档中可以看到:“存储在TIME列中的任何微秒部分都将被丢弃”。 - theazureshadow
@OMG Ponies: 感谢您的回复。我很感激您抽出时间来回答,并重视您的意见。顺便说一下,名字很好笑,哈哈。 - zen

1

我会将其存储为以秒为单位的DECIMAL数字,并添加列来存储DNF或DNS。如果您愿意,可以使用单个枚举来表示DNF和DNS,因为它们是互斥的(假设DNS是未开始)。这允许进行SUM、算术等操作。将其存储为VARCHAR不允许进行任何有趣的处理或过滤。

编辑:更改为DECIMAL,以提高精度。


1
如果你关心精度,就不应该使用浮点类型来处理货币。这样会导致各种奇怪的舍入和比较错误。 - OMG Ponies
我对TIME或DATETIME感到满意,但是你不能存储毫秒,这意味着Zen必须使用单独的列。再次强调:“微秒不能存储在任何时间数据类型的列中”。 - theazureshadow
将其存储为VARCHAR不允许进行任何有趣的处理或过滤...我一直在做的一件事是通过“时间”字段对该表进行排序。默认情况下,这会将DNF放置在所有表行的底部。感谢您所有的回复。在我看来,这是一个有趣的辩论,看到其他人如何处理也很有趣。 - zen
嗯,这确实取决于您的实现中关键的因素(现在和未来)。我认为三个选项(VARCHAR、TIME + 毫秒、DECIMAL)都有很好的理由,我绝对不想争论哪个是普遍最佳答案。 - theazureshadow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接