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"])
...
见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"])
...