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时区
- 修改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时区修改
- 连接时去临时修改
- 使用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
又使用的是mysql
npm包连接的,所以应该差不多
# 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
行的文本
网友评论