Go使用mysql和Postgres的时区问题

使用mysql或postgres数据库来处理时间类型的数据时,经常会要处理时区的问题。对于go开发而言,这两个数据库对时区的处理并不一样,这里做一个简单总结。 myql 时区配置 mysql会根据当前时区对timestamp类型的写入和读取进行处理。mysql维护了三种时区,即系统时区(对应变量system_time_zone),当前时区(对应变量time_zone),以及会话时区。(https://dev.mysql.com/doc/refman/8.0/en/time-zone-support.html) 系统时区:当mysql server启动时,会获取当前操作系统时区,将该时区设置为 system_time_zone 系统变量;如果要明确设置时区可以通过设置TZ环境变量之后再启动mysqld; 如果使用mysqld_safe启动服务,可以通过--timezone参数设置 当前时区:全局系统变量time_zone指明当前mysql服务端所用的时区。初始值是SYSTEM,表明使用操作系统时区。全局服务端时区可以在启动服务时通过命令行参数--default-time-zone指定默认值; 如果当前用户具有SYSTEM_VARIABLES_ADMIN权限,也可以通过SET GLOBAL time_zone = timezone语句来设置当前全局时区。 会话时区:每个client连接会话有它自己的时区设置,默认取全局时区,也可以通过SET time_zone = timezone语句来设置。 查询当前mysql时区配置 通过一下语句 SELECT @@GLOBAL.time_zone, @@SESSION.time_zone; 可以看到当前的全局时区和会话时区,默认情况下会得到: mysql> SELECT @@GLOBAL.time_zone, @@SESSION.time_zone; +--------------------+---------------------+ | @@GLOBAL.time_zone | @@SESSION.time_zone | +--------------------+---------------------+ | SYSTEM | SYSTEM | +--------------------+---------------------+ 通过查看timezone相关mysql系统变量可以看到当前系统时区和当前时区。 show variables like '%time_zone%'; 默认情况下会得到: mysql> show variables like '%time_zone%'; +------------------+--------+ | Variable_name | Value | +------------------+--------+ | system_time_zone | UTC | | time_zone | SYSTEM | +------------------+--------+ timestamp类型 mysql 的timestamp类型支持是不带时区的。mysql来处理写入时会将对写入数据做时区转换,转成UTC来存储;读出时会将UTC存储的数据转为当前时区。也就是说mysql中存储的永远会是UTC时区,而不管当前mysql使用的是什么时区。 例如...

April 24, 2022 · 3 min · hulb

Postgres 分组排序取第一个

之前遇到一个场景,需要写一个sql取一个表中的数据按某字段分组排序后每个组的第一个元素,这里记录下。 ...

September 25, 2019 · 1 min · hulb

Postgresql Sequence

记录下postgres中实现自增id的方式。 ...

September 25, 2019 · 1 min · hulb

Postgresql Change Owner

之前在一次更改postgres数据库owner的时候遇到一些问题做过一点记录,摘录过来。 ...

September 25, 2019 · 1 min · hulb

Pgbadger Analyze

记录一下如何使用pgbadger分析postgres数据库日志。 ...

March 30, 2018 · 1 min · hulb