当时区规则更改时,使用旧规则的应用程序将变得过时。要保持最新状态,有必要确保系统使用当前时区信息。对于MySQL,在保持当前状态时需要考虑两个因素:


如果其时区设置为,则操作系统时间会影响MySQL服务器使用的时间值 SYSTEM。确保您的操作系统正在使用最新的时区信息。对于大多数操作系统,最新的更新或服务包会为系统准备好时间更改。查看您的操作系统供应商的网站,获取解决时间更改的更新。


如果您将系统的/etc/localtime时区文件替换为 使用与mysqld启动时有效的规则不同的版本, 则应重新启动 mysqld以使其使用更新后的规则。否则,当系统更改时间时,mysqld可能不会注意到。


如果您在MySQL中使用命名时区,请确保mysql数据库中的时区表是最新的。如果您的系统具有自己的zoneinfo数据库,则每当更新zoneinfo数据库时,都应该重新加载MySQL时区表。对于没有自己的zoneinfo数据库的系统,请检查MySQL Developer Zone的更新。当有新的更新可用时,请下载并使用它来替换当前时区表的内容。有关这两种方法的说明,请参阅填充时区表。 mysqld的缓存它查找的时区信息,因此在更新时区表之后,应重新启动mysqld以确保它不会继续提供过时的时区数据。


如果您不确定命名时区是否可用,请将其用作服务器的时区设置或由设置其自己的时区的客户端使用,请检查您的时区表是否为空。以下查询确定包含时区名称的表是否有任何行:


mysql> SELECT COUNT(*) FROM mysql.time_zone_name;
+----------+
| COUNT(*) |
+----------+
|        0 |
+----------+
mysql> SELECT COUNT(*) FROM mysql.time_zone_name;
+----------+
| COUNT(*) |
+----------+
|        0 |
+----------+


计数为零表示该表为空。在这种情况下,没有人可以使用命名时区,并且不需要更新表格。大于零的计数表示该表格不是空的,并且其内容可用于命名时区支持。在这种情况下,您应该确保重新加载时区表,以便任何使用命名时区的人都能得到正确的查询结果。

要检查您的MySQL安装是否已正确更新以适应夏令时规则的更改,请使用如下所示的测试。该示例使用的值适用于3月11日凌晨2点在美国发生的2007 DST 1小时更改

测试使用这两个查询:


SELECT CONVERT_TZ('2007-03-11 2:00:00','US/Eastern','US/Central');
SELECT CONVERT_TZ('2007-03-11 3:00:00','US/Eastern','US/Central');
SELECT CONVERT_TZ('2007-03-11 2:00:00','US/Eastern','US/Central');
SELECT CONVERT_TZ('2007-03-11 3:00:00','US/Eastern','US/Central');


这两个时间值表示发生DST更改的时间,并且使用命名时区要求使用时区表。期望的结果是两个查询都返回相同的结果(输入时间,转换为'US / Central'时区中的等效值)。

在更新时区表之前,您会看到如下所示的错误结果:


mysql> SELECT CONVERT_TZ('2007-03-11 2:00:00','US/Eastern','US/Central');
+------------------------------------------------------------+
| CONVERT_TZ('2007-03-11 2:00:00','US/Eastern','US/Central') |
+------------------------------------------------------------+
| 2007-03-11 01:00:00                                        |
+------------------------------------------------------------+

mysql> SELECT CONVERT_TZ('2007-03-11 3:00:00','US/Eastern','US/Central');
+------------------------------------------------------------+
| CONVERT_TZ('2007-03-11 3:00:00','US/Eastern','US/Central') |
+------------------------------------------------------------+
| 2007-03-11 02:00:00                                        |
+------------------------------------------------------------+
mysql> SELECT CONVERT_TZ('2007-03-11 2:00:00','US/Eastern','US/Central');
+------------------------------------------------------------+
| CONVERT_TZ('2007-03-11 2:00:00','US/Eastern','US/Central') |
+------------------------------------------------------------+
| 2007-03-11 01:00:00                                        |
+------------------------------------------------------------+

mysql> SELECT CONVERT_TZ('2007-03-11 3:00:00','US/Eastern','US/Central');
+------------------------------------------------------------+
| CONVERT_TZ('2007-03-11 3:00:00','US/Eastern','US/Central') |
+------------------------------------------------------------+
| 2007-03-11 02:00:00                                        |
+------------------------------------------------------------+


更新表格后,您应该看到正确的结果:


mysql> SELECT CONVERT_TZ('2007-03-11 2:00:00','US/Eastern','US/Central');
+------------------------------------------------------------+
| CONVERT_TZ('2007-03-11 2:00:00','US/Eastern','US/Central') |
+------------------------------------------------------------+
| 2007-03-11 01:00:00                                        |
+------------------------------------------------------------+

mysql> SELECT CONVERT_TZ('2007-03-11 3:00:00','US/Eastern','US/Central');
+------------------------------------------------------------+
| CONVERT_TZ('2007-03-11 3:00:00','US/Eastern','US/Central') |
+------------------------------------------------------------+
| 2007-03-11 01:00:00                                        |
+------------------------------------------------------------+
mysql> SELECT CONVERT_TZ('2007-03-11 2:00:00','US/Eastern','US/Central');
+------------------------------------------------------------+
| CONVERT_TZ('2007-03-11 2:00:00','US/Eastern','US/Central') |
+------------------------------------------------------------+
| 2007-03-11 01:00:00                                        |
+------------------------------------------------------------+

mysql> SELECT CONVERT_TZ('2007-03-11 3:00:00','US/Eastern','US/Central');
+------------------------------------------------------------+
| CONVERT_TZ('2007-03-11 3:00:00','US/Eastern','US/Central') |
+------------------------------------------------------------+
| 2007-03-11 01:00:00                                        |
+------------------------------------------------------------+