了解 MySQL 中的日期和时间数据类型
使用 MySQL 时,选择适当的数据类型来存储日期和时间值可以显着影响数据库的性能和功能。本文探讨了 DATETIME 和 TIMESTAMP 数据类型之间的差异,并提供了在 PHP 服务器端环境中使用它们的建议。
了解这些区别将帮助您为数据库模式设计做出明智的决策。我们将研究这两种数据类型的特征,讨论它们的优点和局限性,并根据您的具体需求和用例提供实用建议,帮助您选择正确的数据类型。
命令 | 描述 |
---|---|
CREATE TABLE | 在数据库中创建一个具有指定列和约束的新表。 |
DATETIME | 存储不带时区的日期和时间值。适合历史数据。 |
TIMESTAMP | 存储日期和时间值,将其转换为 UTC 进行存储,并转换回本地时间进行检索。 |
AUTO_INCREMENT | 每当将新记录插入表中时,都会自动生成唯一编号。 |
DEFAULT CURRENT_TIMESTAMP | 创建新记录时,将 TIMESTAMP 字段的默认值设置为当前日期和时间。 |
$conn->query($sql) | 对数据库执行查询。用于数据插入和检索。 |
$conn->fetch_assoc() | 以关联数组的形式获取结果行,其中列名是键。 |
实施 MySQL 日期和时间字段
提供的脚本演示了如何有效地使用 DATETIME 和 TIMESTAMP 在服务器端使用 PHP 时 MySQL 中的数据类型。第一个脚本创建一个名为的 MySQL 表 events,其中包括两个日期和时间字段: event_date 和 created_at。这 DATETIME 类型用于 event_date 存储事件的具体日期和时间而不考虑时区,使其适合历史数据。这 TIMESTAMP 类型用于 created_at 自动跟踪每条记录的创建时间,在存储时将时间转换为 UTC,在检索时将时间转换回本地时间。这种区别对于需要考虑时区的应用程序至关重要。 第二个脚本说明了如何将数据插入到 events 使用 PHP 的表。它连接到 MySQL 数据库,准备一个 INSERT 语句,并执行它以添加新的事件记录。与数据库的连接是使用以下命令建立的 new mysqli() 函数,并且查询是用 $conn->query($sql) 方法。该脚本还包括错误处理,以便在连接失败或查询遇到问题时提供反馈。此 PHP 脚本可确保日期和时间数据的格式正确并插入到数据库中。
第三个脚本检索并显示来自 events 桌子。它再次连接到数据库,运行 SELECT 查询以获取所有记录,并处理结果。这 $result->fetch_assoc() 函数用于将每一行作为关联数组获取,从而可以通过名称轻松访问列值。然后该脚本循环遍历结果集,输出 id, 17 号, event_date, 和 created_at 每条记录的字段。这演示了如何处理和显示存储在两者中的数据 DATETIME 和 TIMESTAMP 格式,确保应用程序正确解释和呈现与时间相关的信息。
在 MySQL 中使用 DATETIME 和 TIMESTAMP
PHP 和 MySQL:数据库架构设计
// Backend: Creating a MySQL Table with DATETIME and TIMESTAMP fields
CREATE TABLE events (
id INT AUTO_INCREMENT PRIMARY KEY,
event_name VARCHAR(100) NOT ,
event_date DATETIME NOT ,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
// Explanation:
// 'event_date' uses DATETIME to store the date and time of the event.
// 'created_at' uses TIMESTAMP to automatically track the record creation time.
将数据插入 MySQL 表
PHP 和 MySQL:数据插入脚本
<?php
// Backend: PHP Script to Insert Data into the MySQL Table
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "database_name";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$event_name = "Sample Event";
$event_date = "2024-07-10 12:00:00";
$sql = "INSERT INTO events (event_name, event_date)
VALUES ('$event_name', '$event_date')";
if ($conn->query($sql) === TRUE) {
echo "New record created successfully";
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
?>
检索和显示数据
PHP 和 MySQL:获取和显示数据
<?php
// Backend: PHP Script to Retrieve and Display Data from MySQL Table
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT id, event_name, event_date, created_at FROM events";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo "id: " . $row["id"]. " - Name: " . $row["event_name"].
" - Event Date: " . $row["event_date"].
" - Created At: " . $row["created_at"]. "<br>";
}
} else {
echo "0 results";
}
$conn->close();
?>
MySQL 中 DATETIME 和 TIMESTAMP 之间的选择
当在两者之间做出决定时 DATETIME 和 TIMESTAMP 对于 MySQL 中的数据类型,必须考虑它们的独特特征以及它们如何与应用程序的需求保持一致。这 DATETIME 类型非常适合存储在不同时区之间保持一致的日期和时间,例如无论用户位于何处都不应更改的历史记录或事件日期。这是因为 DATETIME 不考虑时区;它存储输入的确切日期和时间,使其易于使用,但如果需要全局一致性,则可能会出现问题。
另一方面, TIMESTAMP 类型旨在存储相对于 UTC 的时间值,并在检索时自动将它们转换为服务器的时区。这使得 TIMESTAMP 对于跟踪更改(例如记录创建或更新时间)特别有用,因为它可以确保不同时区的一致性。当与 PHP, 使用 TIMESTAMP 可以简化时区差异的管理,更轻松地向用户呈现准确的当地时间。然而, TIMESTAMP 与相比,范围更有限 DATETIME,仅支持 1970 年至 2038 年的日期,这可能是长期应用的考虑因素。
有关 MySQL DATETIME 和 TIMESTAMP 的常见问题和解答
- MySQL 中 DATETIME 和 TIMESTAMP 的主要区别是什么?
- DATETIME 按原样存储日期和时间,而 TIMESTAMP 将其存储为 UTC 并将其转换为服务器的时区。
- 我应该使用哪种数据类型来记录事件日期?
- DATETIME 对于事件日期来说更可取,因为它可以保持跨时区的一致性。
- 什么数据类型最适合跟踪记录创建时间?
- TIMESTAMP 非常适合跟踪创建时间,因为它会自动使用当前时间并根据时区进行调整。
- MySQL 如何使用 TIMESTAMP 处理时区?
- MySQL 存储 TIMESTAMP UTC 值并在检索时将其转换为当前时区。
- 我可以使用 TIMESTAMP 存储 1970 年之前的日期吗?
- 不, TIMESTAMP 仅支持 1970 到 2038 之间的日期。使用 DATETIME 对于此范围之外的日期。
- TIMESTAMP 是否会根据记录更改自动更新?
- 是的,如果定义为 DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP, TIMESTAMP 自动更新。
- 如果我在 DATETIME 字段中插入无效日期,会发生什么情况?
- 如果日期无效,MySQL 将插入“0000-00-00 00:00:00”,具体取决于 SQL 模式。
- 如何保证不同服务器时间存储的一致性?
- 使用 TIMESTAMP 确保时间一致性,因为它将所有时间转换为 UTC。
- 我可以使用带有 DATETIME 和 TIMESTAMP 的函数吗?
- 是的,MySQL 的功能如下 NOW() 和 CURRENT_TIMESTAMP 使用这两种数据类型。
- 哪种数据类型的存储效率更高?
- TIMESTAMP 与 DATETIME 的 8 个字节相比,使用 4 个字节的存储效率更高。
关于 MySQL 日期和时间类型的最终想法
总之,两者 DATETIME 和 TIMESTAMP 数据类型在 MySQL 数据库设计中占有一席之地。 DATETIME 对于历史记录或时区一致性至关重要时首选,而 TIMESTAMP 有利于通过自动 UTC 转换来跟踪更改。您的选择应符合应用程序的具体需求,以确保准确有效的日期和时间处理。