
08-mysql时区
查看mysql的时区
要查看 MySQL 当前的时区设置,可以使用以下几种 SQL 命令:
1. 查看全局和会话时区变量
sql
-- 查看全局时区设置(影响所有新连接)
SELECT @@global.time_zone;
-- 查看当前会话的时区设置(只影响当前连接)
SELECT @@session.time_zone;2. 查看所有与时区相关的系统变量
这个命令会显示更详细的信息,包括系统时区和 MySQL 使用的时区。
sql
SHOW VARIABLES LIKE '%time_zone%';执行结果通常会显示如下信息:
| Variable_name | Value |
|---|---|
| time_zone | SYSTEM |
| system_time_zone | CST |
| ... | ... |
time_zone: 表示 MySQL 服务器当前使用的时区。如果值为SYSTEM,表示 MySQL 使用的是操作系统的时区。system_time_zone: 表示 MySQL 服务器启动时检测到的系统时区(如 CST、EDT 等)。
3. 验证当前时间(间接判断时区)
你也可以通过查看当前时间来辅助判断时区是否正确:
sql
SELECT NOW();
-- 或
SELECT CURRENT_TIMESTAMP;将结果显示的时间与你本地时间对比,即可大致判断时区设置是否符合预期。
✅ 总结:最常用和全面的命令是:
sql
SHOW VARIABLES LIKE '%time_zone%';它可以一次性查看所有关键的时区配置。
修改mysql的时区
要将 MySQL 的时区从跟随系统时间(当前为 UTC+8)修改为 UTC 时间(即 UTC+0),你可以按照以下步骤操作。
✅ 目标
- 将 MySQL 的
time_zone设置为'+00:00'(即 UTC) - 确保全局和新连接都使用 UTC 时区
🔧 方法一:通过配置文件永久修改(推荐)
这是最稳妥、持久的方式,避免每次重启后恢复默认。
1. 编辑 MySQL 配置文件
通常位于:
- Linux:
/etc/my.cnf或/etc/mysql/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf - Windows:
my.ini
找到 [mysqld] 段落,添加或修改:
ini
[mysqld]
default-time-zone = '+00:00'如果你想设置为其他时区,比如北京时间 UTC+8,可以写
'+08:00'或'Asia/Shanghai'。
📌 注意:如果你的系统没有启用带时区信息的数据库(如 mysql.time_zone 表为空),建议使用 ±HH:MM 格式而不是时区名称(如 'UTC' 或 'SYSTEM')。
2. 重启 MySQL 服务
让配置生效:
bash
# Linux 常见命令(根据你的系统选择)
sudo systemctl restart mysql
# 或
sudo service mysql restartcmd
:: Windows(以管理员运行)
net stop mysql
net start mysql3. 验证设置是否成功
登录 MySQL 后执行:
sql
SHOW VARIABLES LIKE '%time_zone%';你应该看到输出类似:
| Variable_name | Value |
|---|---|
| time_zone | +00:00 |
| system_time_zone | CST |
| ... | ... |
再查看当前时间是否符合 UTC 时间:
sql
SELECT NOW(); -- 应该显示 UTC 时间(比北京时间慢8小时)🚫 方法二:临时修改(不推荐用于生产环境)
这种方式在 MySQL 重启后会失效。
sql
-- 设置全局时区为 UTC
SET GLOBAL time_zone = '+00:00';
-- 可选:设置会话时区(对当前连接有效)
SET time_zone = '+00:00';⚠️ 注意:此方法只在当前运行期间有效,一旦 MySQL 重启就会恢复原状。适用于测试场景。
❗ 注意事项
确保时区支持已加载
- 如果你打算使用命名时区(如
'UTC','Asia/Shanghai'),需要确保 MySQL 的时区表已初始化。 - 可通过命令检查:sql
SELECT * FROM mysql.time_zone_name WHERE Name = 'UTC'; - 若未初始化,请使用
mysql_tzinfo_to_sql工具导入系统时区数据。
- 如果你打算使用命名时区(如
应用兼容性
- 修改数据库时区可能影响应用程序的时间处理逻辑,尤其是依赖
NOW()、CURDATE()等函数的地方。 - 建议统一应用、数据库、服务器的时区策略。
- 修改数据库时区可能影响应用程序的时间处理逻辑,尤其是依赖
已有时间数据不受影响
- 修改
time_zone不会影响已经存储的DATETIME类型数据(它不带时区)。 - 对
TIMESTAMP类型有影响(因为它会根据当前时区做转换),请谨慎操作。
- 修改
✅ 总结
| 操作 | 命令 |
|---|---|
| 永久设置为 UTC | 在 my.cnf 中添加 default-time-zone = '+00:00' |
| 重启服务 | systemctl restart mysql |
| 验证 | SHOW VARIABLES LIKE '%time_zone%' |
✅ 推荐使用 配置文件 + 重启服务 的方式,确保稳定性和持久性。

