如果变量存储为varchar,则可以将变量识别为int或float或time

时间:2012-05-07 17:50:02

标签: php mysql

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

3 个答案:

答案 0 :(得分:1)

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

有一些问题。你怎么知道连续存储什么数据类型? MySQL确实有RegExp支持,但我不建议在你的WHERE子句中使用它。将数据类型存储在另一列中。

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

答案 1 :(得分:1)

在我看来,你可以将字段建模为FLOAT,除非你绝对需要知道存储的变量类型。通过转换为时间戳,可以将时间转换为整数值。整数是实际设置的实数(浮点数)数字的子集,所以我想这样你就可以覆盖所有内容。浮点运算会导致精度和等式测试的一些问题,但要小心!

答案 2 :(得分:0)

如果对文本执行数学运算,mysql会愉快地将文本转换为相应类型的数字。但是,它还会将非数字文本转换为零并对其执行相同的操作,因此您需要检查是否仅事先提取了相应类型的字段。

This forum post显示了如何向查询中添加正则表达式条件,以确保您只提取包含数字数据的字段。但是,我认为使用单独的列来指示每条记录的得分类型并使用它来检索适当的记录可能更明智。

我不知道如何将文本转换为日期(通过date()放置不起作用)。但请注意,mysql日期格式(2012-05-08 11:20:23)具有日期元素,其重要性递减。如果您只想查找最高/最低日期,或按日期排序,将它们视为字符串将正常工作。