为什么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与SQLserver之间存储过程的转换方式

    MYSQL和SQL Server是两种常用的关系型数据库管理系统,它们都支持存储过程,但是两者的存储过程语言有所不同。因此,在转换存储过程时需要注意一些细节。下面是MYSQL与SQL Server之间存储过程转换的完整攻略和示例说明: 1. 标准转换方式 1.1 MYSQL转换为SQL Server 1.1.1 存储过程定义 在MYSQL中,定义一个简单的存…

    database 2023年5月22日
    00
  • Mysql合并结果接横向拼接字段的实现步骤

    实现Mysql合并结果接横向拼接字段需要使用到Mysql的联接查询和GROUP_CONCAT函数,具体步骤如下: 1.使用联接查询将需要合并的表联接起来,联接的条件为两个表中的一列或多列数据相同。 SELECT A.id, A.name, B.age FROM tableA A JOIN tableB B ON A.id = B.id; 以上示例中,假设ta…

    database 2023年5月22日
    00
  • 【Redis】Redis Stream 介绍

    一、添加数据(往名为mystream的Stream中添加了一个条目) > XADD mystream * sensor-id 1234 temperature 19.8 1518951480106-0     二、获取一个Stream的条目数量 > XLEN mystream (integer) 1     三、XRANGE范围查询 # 根据范围…

    Redis 2023年4月12日
    00
  • Amazon DynamoDB和Amazon Redshift的区别

    Amazon DynamoDB和Amazon Redshift是AWS云平台上两个不同的数据库产品,它们有各自的使用场景和优点。下面是它们的详细比较。 概述 Amazon DynamoDB是一种全托管的NoSQL数据库服务,它具有快速、可扩展、可靠、弹性等特点。Amazon Redshift是一种全托管的数据仓库服务,它是基于列存储的架构,适合大规模的数据分…

    database 2023年3月27日
    00
  • MySQL EXPLAIN输出列的详细解释

    下面详细讲解一下MySQL EXPLAIN输出列的详细解释。 1. EXPLAIN的作用 在MySQL中,通过使用EXPLAIN命令可以分析查询语句的执行计划,从而提高SQL语句的执行效率。EXPLAIN命令会显示MySQL如何处理查询语句,可以帮助我们理解查询语句执行的具体过程和优化查询语句。 2. EXPLAIN的输出列 下面是展示EXPLAIN输出列的…

    database 2023年5月22日
    00
  • C#连接mysql数据库完整实例

    C#连接mysql数据库完整实例 前言 本文将介绍在C#中如何连接mysql数据库。通过阅读本文,你将学到如下知识: 下载并安装与mysql连接的必备工具; C#连接mysql数据库的代码; 如何进行数据库的增加/删除/修改/查询。 步骤 步骤一:安装mysql和mysql .NET Connector 下载并安装mysql数据库:从mysql官网下载安装m…

    database 2023年5月21日
    00
  • mysql插入记录INSERT与多表更新

    1、第一种:INSERT [INTO] tbl_name[ (col_name, … ) ]  {VALUES | VALUE}({expr |default}, … ), (…), … 如果为自动编号的字段赋值的话,可以采用NULL或者DEFAULT让其采用默认的递增的形式来实现。 INSERT users VALUES(DEFAULT, …

    MySQL 2023年4月16日
    00
  • 如何优化SQL语句(全)

    以下是如何优化 SQL 语句的完整攻略: 1. 确定优化目标和范围 在进行 SQL 优化之前,必须先确定优化的目标和优化的范围。目标是什么?但凡是涉及查询性能的问题,往往都是执行效率低下。如果你能通过优化 SQL 减少了查询所需时间,或者缩短了执行查询所需时间的界面响应时间,那么目标就可以算是达成了。而范围则是只考虑 SQL 查询的优化,也就是针对 SELE…

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