MySql 数据类型与 PHP 格式对比,同时不丢失数字排序功能

MySql datatype versus PHP formatting whilst not losing numeric sorting capabilities

http://pdga-europe.com/standings-2015/

这可能是您最近看到的最简单的问题,但我被难住了。

我正在将 XLS sheet 导入到 MySql 数据库,大部分数据是整数,但有些(实际上,只有一些)是分数(精确到 .5)

数据类型被 PHPMyAdmin 设置为 DECIMAL (4,1),并且所有数学计算都是正确的(我正在对所有数据进行降序排序(对于总计为“0”的数据,我' m 使用不可见的列 "totaled" 进行排序)。

我想看的是:

该特定列 (ET3) 中的所有整数都显示为整数(而不是 xxx.0),只有其他的显示为 yyy.5?

VARCHAR 至少会正确显示它,但它显然会阻止我以字母顺序以外的任何方式对数据进行排序(其中 9 突然出现在 88 之前)。

我应该走什么路才能做到这一点?

我应该找到正确的数据类型,还是应该在 PHP 中进行格式化?

目前我的数据是这样生成的:

<..query bla bla ..>
printf("
<tr>
<td>%s</td>
</tr>\n",
$row["ET3"]);
}

谢谢。

您不应该修改存储这些值的数据类型,因为您真正处理的只是显示逻辑问题。在内部,只要其中一些有小数部分,都应该存储为数字类型的小数部分,而不是 VARCHAR 类型。

因此您应该处理 PHP 中的显示逻辑,并且可以通过多种不同的方式完成。从 MySQL 中检索值,您将在 $row['ET3'] 中得到一个字符串而不是 PHP 浮点值,这使得使用基本字符串操作 like substr(). You may test if the last two characters of are ".0" and truncate it with intval() 更容易处理。例如:

// Intval truncates the .0
echo intval('9.0');
// 9

使用三元在一行中执行切换:

echo substr($row["ET3"], -2) == ".0" ? intval($row["ET3"]) : $row["ET3"];

填充到您现有的 printf() 中的表达式作为:

printf("
<tr>
<td>%s</td>
</tr>\n",
(substr($row["ET3"], -2) == ".0" ? intval($row["ET3"]) : $row["ET3"]));

虽然上面的三元组在您现有的 printf() 上下文中更紧凑,但可以像这样以扩展形式表示。

if (substr($row["ET3"], -2) == ".0") {
  // Truncate to an integer
  // intval($row["ET3"])
}
else {
  // Return the full original value (N.5)
  // $row["ET3"];
}

最后,如果您想在多个地方使用它,请考虑将其包装在一个函数中:

function truncInt($value) {
 return substr($value, -2) == ".0" ? intval($value) : $value; 
}

然后只需在您原来的 printf() 中使用 truncInt($row["ET3"])...