如果变量存储为 varchar,是否可以将其识别为 int 或浮点数或时间


Can a variable be recognized as an int or float or time if its stored as a varchar

我需要在mysql字段中存储分数,但这个分数可以是时间,整数或浮点数。我这样做的第一种方法是识别分数类型,然后将其输入到三个字段之一中,但如果需要添加新的分数类型,我不想不断地向数据库添加一个字段。我记得在某个地方有人告诉我,如果你将某些东西存储为 varchar,那么将无法读取为整数或浮点数甚至日期。我的问题是,我可以将所有这三个存储为一种特定类型,但在从数据库中获取并在我的 php 代码中使用它时,我可以以任何我需要的方式读取它吗?

在我看来,

您可以将字段建模为 FLOAT,除非您绝对需要了解存储的变量类型。通过转换为时间戳,可以将时间转换为整数值。整数实际上是实数(浮点数)集的子集,所以我想这样你就涵盖了所有内容。浮点运算可能会导致精度和相等性测试出现一些问题,但要小心!

您可以使用

CAST和CONVERT函数将字符串数据类型转换为另一种MySQL数据类型,例如INT,FLOAT,DECIMAL,DATE,DATETIME等。

有几个问题。你怎么知道一行中存储了什么数据类型?MySQL确实有正则表达式支持,但我不建议在你的WHERE子句中使用它。将数据类型存储在另一列中。

此外,在查询的 where 子句中使用强制转换函数会使它们运行缓慢。如果您需要按数据搜索/排序,则应使用正确的数据类型。也许您应该为每个数据类型添加一列;对于每一行,仅填充相应的列。

如果您对其执行数学运算,MySQL将很乐意将文本转换为适当类型的数字。但是,它还会将非数字文本转换为零并对其执行相同的操作,因此您需要事先检查是否只提取适当类型的字段。

此论坛帖子展示了如何向查询添加正则表达式条件,以确保仅提取包含数值数据的字段。但是,我认为使用单独的列来指示每条记录的分数类型,并使用它来检索适当的分数可能更明智。

我不知道如何将文本转换为日期(通过date()不起作用)。但是,请注意,mysql 日期格式 (2012-05-08 11:20:23) 具有按降序有效顺序排列的日期元素。如果您只想查找最高/最低日期,或按日期排序,将它们视为字符串就可以正常工作。