在 MariaDB 中设置命名时区

本文描述在 MariaDB 中设置命名时区的步骤。

发布于

命名时区是指使用时区的名字,而不是和标准时间的小时差。比如 Asia/Chongqing 是命名时区,而 +08:00 不是命名时区。

在 MariaDB 中,您默认情况下并不能直接使用命名时区。要使用他们,您必须先配置他们。

下面介绍如何在 MariaDB 中配置命名时区。

时区表

和 MySQL 相同,在 MariaDB 中的 mysql 数据库中具有以下时区表:

  • time_zone
  • time_zone_leap_second
  • time_zone_name
  • time_zone_transition
  • time_zone_transition_type

这些表会随着 MariaDB 安装而创建,但是他们是空的。你需要首先填充这些表,才能使用他们。

要填充这些表,请根据不同的操作系统进行操作。

如果你的系统包含 zoneinfo 文件,比如 Mac OS, Linux, FreeBSD, Sun Solaris, 请使用 mysql_tzinfo_to_sql 实用程序从 zoneinfo 文件中读取并填充 mysql.time_zone* 表。

如果你的系统不包含 zoneinfo 文件,比如 Windows, 请到 https://dev.mysql.com/downloads/timezones.html 下载对应的文档,并将他们填充到 mysql.time_zone* 表。

从 zoneinfo 导入时区

如果您的系统是类 Unix 系统,比如 Mac OS, Linux, FreeBSD, Sun Solaris, 请运行以下命令加载时区表到 MariaDB 中的 mysql 数据库中:

mysql_tzinfo_to_sql /usr/share/zoneinfo | mariadb -u root -p mysql

或者

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

根据提示输入 root 用户的密码, 时区表会被立刻填充。

您可能会收到一个警告:

Warning: Unable to load '/usr/share/zoneinfo/leapseconds' as time zone. Skipping it.

您可以忽略这个警告。这是由于类 Unix 系统不包含闰秒,但是,这符合 POSIX(可移植操作系统接口)标准。

从 MySQL 提供的脚本中导入

对于 Windows 系统,由于没有没有 zoneinfo 数据库,您需要通过 SQL 脚本加载时区表。请按照以下步骤操作:

  1. 下载 SQL 脚本: https://downloads.mysql.com/general/timezone_2022g_posix_sql.zip

  2. 解压缩刚刚下载的文件,您会得到一个文件:timezone_posix.sql

  3. 使用以下命令登录 MariaDB:

    .\mysql.exe -u root -p
    

    输入 root 用户密码,并确认。

  4. 连接 MySQL 数据库

    USE mysql
    
  5. 从 SQL 脚本文件导入数据:

    SOURCE C:\Users\Adam\Downloads\timezone_posix.sql
    

使用时区表

当通过上面的方法导入时区信息后,您可以从 mysql.time_zone_name 查询以检查是否正确导入。

例:

SELECT *
FROM mysql.time_zone_name;

输出:

+----------------------------------+--------------+
| Name                             | Time_zone_id |
+----------------------------------+--------------+
| Africa/Abidjan                   |            1 |
| Africa/Accra                     |            2 |
| Africa/Addis_Ababa               |            3 |
| Africa/Algiers                   |            4 |
| Africa/Asmara                    |            5 |
| Africa/Asmera                    |            6 |
| Africa/Bamako                    |            7 |
| Africa/Bangui                    |            8 |
| Africa/Banjul                    |            9 |
| Africa/Bissau                    |           10 |
...
...
| Zulu                             |          597 |
+----------------------------------+--------------+
597 rows in set (0.000 sec)

结论

本文描述了在不同的系统中填充 MariaDB 时区表的不同的方法。