27

我正在尝试将时区加载到我的 MySql 实例(在 Ubuntu 上运行),以便我可以使用 CONVERT_TZ 函数,但是当我运行以下命令时:

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

我得到以下输出,当我尝试使用CONVERT_TZ它时,它仍然返回NULL

警告:无法将“/usr/share/zoneinfo/Asia/Riyadh87”加载为时区。跳过它。警告:无法将“/usr/share/zoneinfo/Asia/Riyadh88”加载为时区。跳过它。警告:无法加载“/usr/share/zoneinfo/Asia/Riyadh89”作为时区。跳过它。警告:无法将“/usr/share/zoneinfo/Mideast/Riyadh87”加载为时区。跳过它。警告:无法将“/usr/share/zoneinfo/Mideast/Riyadh88”加载为时区。跳过它。警告:无法将“/usr/share/zoneinfo/Mideast/Riyadh89”加载为时区。跳过它。警告:无法将“/usr/share/zoneinfo/iso3166.tab”作为时区加载。跳过它。警告:无法将“/usr/share/zoneinfo/posix/Asia/Riyadh87”加载为时区。跳过它。警告:无法加载“ /usr/share/zoneinfo/posix/Asia/Riyadh88' 作为时区。跳过它。警告:无法将“/usr/share/zoneinfo/posix/Asia/Riyadh89”加载为时区。跳过它。警告:无法将“/usr/share/zoneinfo/posix/Mideast/Riyadh87”加载为时区。跳过它。警告:无法将“/usr/share/zoneinfo/posix/Mideast/Riyadh88”加载为时区。跳过它。警告:无法将“/usr/share/zoneinfo/posix/Mideast/Riyadh89”加载为时区。跳过它。警告:无法将“/usr/share/zoneinfo/right/Asia/Riyadh87”加载为时区。跳过它。警告:无法将“/usr/share/zoneinfo/right/Asia/Riyadh88”加载为时区。跳过它。警告:无法加载“/usr/share/zoneinfo/right/Asia/Riyadh89”作为时区。跳过它。警告:无法加载“ /usr/share/zoneinfo/right/Mideast/Riyadh87' 作为时区。跳过它。警告:无法将“/usr/share/zoneinfo/right/Mideast/Riyadh88”加载为时区。跳过它。警告:无法将“/usr/share/zoneinfo/right/Mideast/Riyadh89”加载为时区。跳过它。警告:无法将“/usr/share/zoneinfo/zone.tab”加载为时区。跳过它。

有谁知道为什么会发生这种情况?

PS:

我正在使用以下方法来转换日期时间:

CONVERT_TZ(NOW(),'UTC', 'PCT')

是否有可能我只是转换不正确,这就是 NULL 结果的原因?

4

2 回答 2

28

这是 Debian 上 Riyadh* 时区文件的一个错误:

http://bugs.mysql.com/bug.php?id=20545

推荐的解决方法是简单地忽略警告(如果您当然不需要这些时区):

mysql_tzinfo_to_sql /usr/share/lib/zoneinfo | mysql -uroot --force mysql

使用该选项导入 TZ 数据后--force,您将能够使用CONVERT_TZ. 这是我刚刚完成的内容的转录:

sh$ mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -uroot -p mysql --force 2> /dev/null
Enter password: ********
sh$ mysql -p
Enter password: ********
Server version: 5.1.49-3 (Debian)

mysql> select convert_tz(now(), 'UTC', 'CET');
+---------------------------------+
| convert_tz(now(), 'UTC', 'CET') |
+---------------------------------+
| 2013-08-13 21:04:34             |
+---------------------------------+
1 row in set (0.00 sec)
于 2013-08-13T18:54:02.467 回答
6

不幸的是,Sylvain 的解决方案对我不起作用。

PHPMyAdmin通过从我的开发计算机(在 Windows 上)导出表并稍微调整创建脚本,我能够填充生产服务器的时区表。

由于脚本太长,无法在帖子中共享,因此我将其托管在我的 Google Drive 上。

安装脚本(去掉新行和注释):

https://drive.google.com/file/d/0B7iwL5F-hwr_YkItRXk2Z1VZdlE/view?usp=sharing

带有注释的脚本:

https://drive.google.com/file/d/0B7iwL5F-hwr_dWdjTDREcXNHQmM/view?usp=sharing

确保使用没有注释的版本。评论版本运行大约需要 5 分钟,但由于某种原因最终失败,而剥离版本运行时间不到 5 秒。

注意:您可能需要运行 asroot才能使其正常工作。

于 2016-07-15T14:06:10.723 回答