为什么MySQL 使用timestamp可以无视时区问题.

为什么MySQL使用timestamp可以无视时区问题?

在MySQL中,使用timestamp类型进行日期和时间的存储,它是一种与时区无关的数据类型。无论你是哪个时区,时间都会以相同的方式存储在timestamp类型字段中。下面分为以下几个方面进行讲解。

  1. timestamp存储的时间是UTC(协调世界时)

如下面的代码块所示,我们可以使用NOW()函数获取当前时间并插入到一个timestamp类型的字段中。

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `user` (`name`) VALUES ('John');

查询该记录的created_at字段,返回的时间与查询服务器的时区无关,在MySQL内部都是UTC时间。

SELECT `id`, `name`, `created_at`
FROM user
WHERE name = 'John';

返回结果如下:

+----+------+---------------------+
| id | name | created_at          |
+----+------+---------------------+
|  1 | John | 2021-08-31 12:34:56 |
+----+------+---------------------+
  1. MySQL会自动将本地时间转换为UTC时间进行存储

在MySQL中,无论你在哪个时区将本地时间存储到timestamp类型的字段中,MySQL都会将本地时间转换为UTC时间,然后存储到该字段中。也就是说,时间的存储方式与时区无关,只与UTC有关。下面的代码演示了这一点。

例如在中国的时区设置为CST(中国标准时间),如果你在上海服务器设置一个时间并存储到timestamp类型的字段中,如下所示。

SET time_zone = '+8:00';
SELECT NOW();

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `user` (`name`, `created_at`) VALUES ('John', '2021-08-31 12:34:56');

程序在上海服务器的时区下运行,现在我们要查询北京的时间,将时区设置为东八区,如下所示。

SET time_zone = '+8:00';
SELECT `id`, `name`, `created_at`
FROM user
WHERE name = 'John';

结果如下,可以看到存储到timestamp类型的字段中的时间会被自动转换为UTC时间。

+----+------+---------------------+
| id | name | created_at          |
+----+------+---------------------+
|  1 | John | 2021-08-31 04:34:56 |
+----+------+---------------------+
  1. MySQL会将timestamp类型的字段转换为本地时间进行显示

当我们在查询timestamp类型字段时,MySQL会自动将该字段的UTC时间转为当前的时区,然后显示在客户端上。这样我们在使用timestamp类型存储时间时,不需要考虑到时区的问题。下面的代码演示了这一点。

例如在中国的时区设置为CST(中国标准时间),我们将一个timestamp类型的字段中存储了UTC时间。查询该记录时,MySQL会将存储的UTC时间自动转为本地时间进行显示,如果你在上海查询,如下所示。

SET time_zone = '+8:00';
SELECT `id`, `name`, `created_at`
FROM user
WHERE name = 'John';

结果如下,可以看到该条记录的时间已经自动转换为中国标准时间(CST),时间显示时区与查询时设置的时区相同。

+----+------+---------------------+
| id | name | created_at          |
+----+------+---------------------+
|  1 | John | 2021-08-31 12:34:56 |
+----+------+---------------------+
  1. 示例1

我们在数据库中插入一个时间,并将本地的时区设置为东八区,然后查询该时间,并将时区设置为美国洛杉矶的时区。代码如下:

SET time_zone = '+8:00';
SELECT NOW();

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `user` (`name`, `created_at`) VALUES ('Lucy', '2021-09-01 12:34:56');

查询语句:

SET time_zone = '-7:00';
SELECT `id`, `name`, `created_at`
FROM user
WHERE name = 'Lucy';

结果如下,我们查询时的时区是美国洛杉矶的时区,但是查询结果中的时间已经自动转换为美国洛杉矶的本地时间。

+----+------+---------------------+
| id | name | created_at          |
+----+------+---------------------+
|  1 | Lucy | 2021-09-01 05:34:56 |
+----+------+---------------------+
  1. 示例2

我们在数据库中插入一个时间,并将本地的时区设置为美国洛杉矶的时区,然后查询该时间,并将时区设置为中国上海的时区。代码如下:

SET time_zone = '-7:00';
SELECT NOW();

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `user` (`name`, `created_at`) VALUES ('Lucy', '2021-09-01 12:34:56');

查询语句:

SET time_zone = '+8:00';
SELECT `id`, `name`, `created_at`
FROM user
WHERE name = 'Lucy';

结果如下,我们查询时的时区是中国上海的时区,但是查询结果中的时间已经自动转换为中国上海的本地时间。

+----+------+---------------------+
| id | name | created_at          |
+----+------+---------------------+
|  1 | Lucy | 2021-09-01 03:34:56 |
+----+------+---------------------+

综上所述,MySQL使用timestamp可以无视时区问题,主要是因为它存储的是UTC时间,并且自动将本地时间转换为UTC时间进行存储,同时在查询时会将UTC时间转换为本地时间进行显示,这种机制可以让我们在使用timestamp存储时间时,无需考虑时区的问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:为什么MySQL 使用timestamp可以无视时区问题. - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • MySQL数据类型优化原则

    MySQL数据类型优化原则是优化数据库性能的重要手段。在选择合适的数据类型时,需要考虑数据的存储需求和应用场景,并遵循以下几个原则。 1. 尽量避免使用TEXT、BLOB类型 TEXT、BLOB类型需要额外的存储空间,且更难被索引,容易造成查询效率低下的问题。在可控范围内尽量避免使用这两种类型。 2. 使用最小的数据类型 在数据类型支持的情况下,应尽量使用最…

    database 2023年5月19日
    00
  • DBMS中的OLAP与OLTP区别

    1. OLAP和OLTP的概念及特点 1.1 OLAP概念及特点 OLAP(Online Analytical Processing)中文翻译为在线分析处理。它是一种数据分析技术,能够快速地对大型、复杂、多维数据进行查询、分析和统计,为企业决策提供数据支持。OLAP系统具有以下特点: 面向主题:OLAP系统是面向企业的分析需求,针对分析任务进行构建和优化。 …

    database 2023年3月27日
    00
  • linux忘记mysql密码处理方法

    下面是“Linux忘记MySQL密码处理方法”的完整攻略: 1. 查看MySQL服务状态 首先,我们需要检查MySQL服务是否正在运行。可以运行以下命令: systemctl status mysql.service 如果MySQL服务正在运行,你应该能够看到以下类似的输出: ● mysql.service – MySQL Community Server …

    database 2023年5月22日
    00
  • MySQL 到Oracle 实时数据同步

    下面详细介绍“MySQL 到Oracle 实时数据同步”的攻略和示例。 准备工作 搭建 MySQL 和 Oracle 数据库环境; 安装 Canal 工具,用于实现 MySQL 到 Oracle 的数据同步; 安装配置 DataX 工具,用于实现 Oracle 数据库的数据同步。 实现过程 1. Canal 工具实现 MySQL 到 Oracle 的数据同步…

    database 2023年5月22日
    00
  • SQL WHERE IN参数化编译写法简单示例

    下面我将为您详细讲解“SQL WHERE IN参数化编译写法简单示例”的完整攻略。 SQL WHERE IN参数化编译写法简介 在 SQL 中,我们常常需要使用到 WHERE IN 语法来查询一段区间内的数据。将参数与 SQL 语句拼接在一起虽然可行,但容易造成 SQL 注入的风险。参数化编译能够避免这一风险,而且能够提高语句的执行效率。 下面具体讲解 SQ…

    database 2023年5月21日
    00
  • SQL server 自增ID–序号自动增加的字段操作

    “SQL Server 自增ID”通常指的是在表中创建一个自动递增的主键字段,它可以确保每一条记录都拥有一个唯一的标识符,并且可以自动增加,而不需要手动指定。下面是创建自增字段的完整攻略,包括创建表时设置自增字段以及插入记录时使用它。 创建表时设置自增字段 创建自增字段的方式是在表定义中为主键字段指定 IDENTITY 属性,这样每次插入新记录时,SQL S…

    database 2023年5月21日
    00
  • mysql多个left join连接查询用法分析

    MySQL多个LEFT JOIN连接查询用法分析 在MySQL中,多个LEFT JOIN连接查询是非常常见的操作,它可以将多张表的数据进行关联,使得查询结果更加详细。本文将详细讲解MySQL多个LEFT JOIN连接查询的用法及示例操作。 什么是多个LEFT JOIN连接查询 多个LEFT JOIN连接查询是指在一个SQL语句中,使用LEFT JOIN关键字…

    database 2023年5月22日
    00
  • mysql常用日期时间/数值函数详解(必看)

    MySQL常用日期时间/数值函数详解(必看) 日期和时间函数 NOW() NOW() 函数返回当前日期和时间。 示例: SELECT NOW(); 输出: +———————+ | NOW() | +———————+ | 2021-10-27 16:30:53 | +——————-…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部