mysql时区问题

mysql时区问题

查询mysql时区

我在使用mysql时,与实际的时间相差了8小时

通过命令查出mysql的时区

mysql > show variables like '%time_zone%';

+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | UTC    |
| time_zone        | SYSTEM |

所以出现相差了8个小时的时区问题

  • system_time_zone:是只读的,在每次启动mysql时读取系统的时区。
  • time_zone:默认值是SYSTEM, 走的系统时间。

修改mysql时区

  1. 修改docker中启动的mysql
    由于我使用的是docker启动的服务,所以这个是在docker中使用mysql的修改方法,进入到容器中,修改/etc/mysql/my.cnf
# my.cnf

[mysqld]
default-time-zone = '+08:00'

在[mysqld]下追加default-time-zone = '+08:00'

注意:如果表字段类型是datetime,它不支持时区的动态变换,存储数据的时候没有时区的概念;如果想要有时区概念,那么要用timestamp类型的

上面的方法不是很好,最好是通过修改外部挂载或者连接mysql时区修改

  1. 连接时去临时修改
  • 使用npm包中的mysql,直接追加参数
const mysql = require('mysql')
const defaultOptions = {}
const options = {
    ...defaultOptions,
    timezone: '+08:00'
}
const connection = mysql.createConnectin(options)
connection.connect();
// ...
connection.end();
  • 使用egg-mysql时,由于文档上说使用的是ali-rds,而ali-rds又使用的是mysqlnpm包连接的,所以应该差不多
# config/config.default.js
config.mysql = {
    client: {
          host: 'host',
          port: 3306,
          user: 'user',
          password: 'password',
          database: 'database',
          timezone: '+08:00'
    },
    app: true,
    agent: false
}

在修改my.cnf时遇到的问题

使用bash进入容器后,无法用vi或者vim去编辑修改,这里使用其他方式

$ echo default-time-zone = "'+08:00'" >> my.cnf

注意:"'+08:00'"这里加双引号是为了将单引号输入进去,不加将忽视单引号

如果添加错了,通过下面命令删除再重新输入

# 定义记录行数的变量
$ A=$(sed -n '$=' my.cnf)
# 删除指定行数的,这里是最后一行
$ sed $(($A)),${A}d -i my.cnf

这是删除最后一行的,如果想删除指定行数的文本:

  • sed $(($A)),${A-n+1}d -i my.cnf删除倒数第n行的文本
  • sed $(($A)),${n}d -i my.cnf删除正数第n行的文本
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容