PHP查询MySQL timestamp字段丢失毫秒部分如何解决
问题原因
首先确认两个前提:
- 你的数据库
lin_m4表的segundos字段必须是TIMESTAMP(3)类型:MySQL默认的TIMESTAMP不带精度参数时,只会存储到秒,小数部分会直接丢弃,你需要把字段精度设为3(保留3位毫秒),最高可以设为6保留微秒。如果字段已经是带精度的类型,那么问题出在PHP的mysqli扩展读取timestamp字段时默认会截断小数秒部分。
解决方案
方案1:SQL层面格式化(最稳妥,兼容所有环境)
不需要修改PHP配置,直接调整查询语句,用DATE_FORMAT函数把时间字段格式化后返回,修改你的SQL语句为:
SELECT id, DATE_FORMAT(segundos, '%Y-%m-%d %H:%i:%s.%f') AS segundos, valor FROM lin_m4 ORDER BY id DESC LIMIT 1
如果只需要保留3位毫秒,可以调整格式化逻辑:
SELECT id, CONCAT( DATE_FORMAT(segundos, '%Y-%m-%d %H:%i:%s.'), LPAD(MICROSECOND(segundos) / 1000, 3, '0') ) AS segundos, valor FROM lin_m4 ORDER BY id DESC LIMIT 1
方案2:修改mysqli连接配置
如果你的PHP使用的是mysqlnd驱动(PHP 5.4+默认启用),可以在建立连接后添加配置项,让mysqli保留时间字段的小数部分:
在$conn = new mysqli(...)之后添加如下代码:
$conn->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);
该方案依赖PHP的驱动版本,兼容性不如方案1。
修改后的完整代码示例(采用方案1)
<?php header("Content-Type: application/json; charset=UTF-8"); $servername="localhost"; $username="root"; $password="something"; $dbname="somethingelse"; // Create connection $conn = new mysqli($servername, $username, $password, $dbname); if (!$conn) { die("Connection failed: " . $conn->connect_error); } $sql = <<<SQL SELECT id, DATE_FORMAT(segundos, '%Y-%m-%d %H:%i:%s.%f') AS segundos, valor FROM lin_m4 ORDER BY id DESC LIMIT 1 SQL; $stmt = $conn->prepare($sql); $stmt->execute(); $result = $stmt->get_result(); $outp = $result->fetch_all(MYSQLI_ASSOC); $outpf = json_encode($outp); echo $outpf; $conn->close(); ?>
内容的提问来源于stack exchange,提问作者ignacio guirado
相关产品推荐
相关产品推荐

