<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Golang on Winterfall</title>
    <link>https://blog.hulb.club/categories/golang/</link>
    <description>Recent content in Golang on Winterfall</description>
    <image>
      <title>Winterfall</title>
      <url>https://avatars2.githubusercontent.com/u/7296536</url>
      <link>https://avatars2.githubusercontent.com/u/7296536</link>
    </image>
    <generator>Hugo -- 0.128.0</generator>
    <language>en</language>
    <lastBuildDate>Sun, 24 Apr 2022 00:04:16 +0800</lastBuildDate>
    <atom:link href="https://blog.hulb.club/categories/golang/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Go使用mysql和Postgres的时区问题</title>
      <link>https://blog.hulb.club/posts/go-mysql-postgres-timezone/</link>
      <pubDate>Sun, 24 Apr 2022 00:04:16 +0800</pubDate>
      <guid>https://blog.hulb.club/posts/go-mysql-postgres-timezone/</guid>
      <description>使用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&amp;gt; SELECT @@GLOBAL.time_zone, @@SESSION.time_zone; +--------------------+---------------------+ | @@GLOBAL.time_zone | @@SESSION.time_zone | +--------------------+---------------------+ | SYSTEM | SYSTEM | +--------------------+---------------------+ 通过查看timezone相关mysql系统变量可以看到当前系统时区和当前时区。
show variables like &amp;#39;%time_zone%&amp;#39;; 默认情况下会得到：
mysql&amp;gt; show variables like &amp;#39;%time_zone%&amp;#39;; +------------------+--------+ | Variable_name | Value | +------------------+--------+ | system_time_zone | UTC | | time_zone | SYSTEM | +------------------+--------+ timestamp类型 mysql 的timestamp类型支持是不带时区的。mysql来处理写入时会将对写入数据做时区转换，转成UTC来存储；读出时会将UTC存储的数据转为当前时区。也就是说mysql中存储的永远会是UTC时区，而不管当前mysql使用的是什么时区。 例如</description>
    </item>
  </channel>
</rss>
