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

yizhihongxing

为什么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日

相关文章

  • 如何使用Python在MySQL中使用子查询?

    在MySQL中,子查询是一种嵌套在其他查询中的查询。子查询可以用于检索满足特定条件的数据,然后将这些数据用于主查询中。在Python中,可以使用MySQL连接来执行子查询。以下是在Python中使用子查询的完整攻略,包括子查询的基本语法、使用子查询的示例以及如何在Python中使用子查询。 子查询的基本语法 子查询的基本语法如下: SELECT column…

    python 2023年5月12日
    00
  • centos中mysql备份数据库脚本分享

    下面我将详细讲解在CentOS中使用备份数据库脚本的完整攻略。具体内容包括: 一、准备工作 在使用备份数据库脚本前,我们需要做一些准备工作: 1.安装MySQL客户端 我们需要在CentOS系统中安装MySQL客户端,以便在脚本中使用MySQL命令对数据库进行备份操作,执行以下命令即可: sudo yum install mysql 2.创建备份目录 为了保…

    database 2023年5月22日
    00
  • C++连接mysql数据库的两种方法小结

    C++连接mysql数据库的两种方法小结 本文将详细讲解两种在C++中连接MySQL数据库的方法,分别是MySQL C API和使用第三方库MySQL Connector/C++。读者可以在这两种方法中选择适合自己的连接方式。 一、使用MySQL C API MySQL C API是MySQL官方提供的C语言的API,这种方式是比较底层的操作方式,需要具备一…

    database 2023年5月22日
    00
  • CentOS8下MySQL 8.0安装部署的方法

    以下是CentOS 8下MySQL 8.0安装部署的方法: 准备工作 在安装MySQL之前,需要先安装依赖包和更新系统 sudo yum install -y wget net-tools vim sudo yum update -y 下载MySQL安装包 MySQL官方提供了RPM包安装方式,可以先去官网下载对应版本的rpm包:https://dev.my…

    database 2023年5月22日
    00
  • python定时任务apscheduler的详细使用教程

    Python定时任务apscheduler的详细使用教程 什么是apscheduler apscheduler是一个Python的任务调度库,可以用来执行定时任务和周期任务,支持多种任务触发器(如日期、时间间隔、文件修改、网络地址等),可以很好的满足各种任务调度的需求。 怎么安装apscheduler 可以使用pip进行安装。 pip install aps…

    database 2023年5月22日
    00
  • 如何使用Python将CSV文件导入到MySQL数据库中?

    如何使用Python将CSV文件导入到MySQL数据库中? 将CSV文件导入到MySQL数据库中是一个常见的任务,Python提供了许多库来完成这个任务。在本攻略中,我们将pandas和mysql-connector-python来完成这个任务。以下是使用Python将CSV文件导入到MySQL数据库中的完整攻略。 步骤1:安装必要的库 在使用Python将…

    python 2023年5月12日
    00
  • MySQL中的隐藏列的具体查看

    确定隐藏列 MySQL中的隐藏列指的是不在SELECT语句中显示的列。虽然这些列已经存在于数据库中,但却不在查询结果中显示出来。要确定数据库表中是否存在隐藏列,可以使用以下步骤: 打开MySQL客户端,并登录到MySQL服务器。 在MySQL客户端中,选择要查看的数据库,或使用以下命令打开数据库: USE database_name; 输入以下语句以查看表格…

    database 2023年5月22日
    00
  • mysql-client ERROR 2002解决方法

    主机环境:debian 8 开发环境 :xampp 安装 mysql-client: #apt-get install mysql-client 启动xampp mysql环境: #/opt/lampp/./lampp startmysql 连接mysql  会报2002 错误: ERROR 2002 : Can’t connect to local MyS…

    MySQL 2023年4月12日
    00
合作推广
合作推广
分享本页
返回顶部