php毫秒时间戳存入mysql时,推荐使用bigint类型存储数值,而非datetime。这样做能避免时区转换带来的精度丢失和计算复杂度,直接以整数形式保留原始毫秒值,便于跨系统交换和范围查询。

BIGINT存储毫秒时间戳的具体实现
使用BIGINT存储时,只需在PHP中将time() * 1000的结果作为整数传入SQL语句即可。这种方式不依赖数据库的日期函数,插入速度快且数据格式统一。

$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$ms = time() * 1000;
$stmt = $pdo->prepare('INSERT INTO events (created_at) VALUES (?)');
$stmt->execute([$ms]);
echo "Stored: " . $ms;
预期输出为当前时间的毫秒级整数值,例如1715623456789。该值直接对应Unix时间戳的千倍放大,无单位歧义。
DATETIME存储毫秒时间戳的局限性
DATETIME类型默认只支持秒级精度,即使使用DATETIME(3)支持毫秒,也需通过FROM_UNIXTIME()或字符串格式化转换。这种转换增加了CPU开销,且在跨时区环境下容易出错。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。

$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$dt = date('Y-m-d H:i:s.', time()) . sprintf('%03d', (int)(microtime(true) * 1000) % 1000);
$stmt = $pdo->prepare('INSERT INTO events (created_at) VALUES (?)');
$stmt->execute([$dt]);
echo "Stored: " . $dt;
预期输出为类似2024-05-14 10:30:56.123的字符串。该格式虽可读性强,但查询时需额外转换,且不同数据库对DATETIME精度的支持不一致。
基于BIGINT存储的查询与转换问题
当使用BIGINT存储毫秒时间戳后,若需在PHP中将其转回可读日期,应使用date('Y-m-d H:i:s', $ms / 1000)并手动处理毫秒部分。此过程需注意整数除法可能导致的精度截断,建议先除以1000再取余数获取毫秒。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










