无法加载时区?

时间:2013-08-13 18:10:35

标签: mysql database

我正在尝试将时区加载到我的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结果的原因?

2 个答案:

答案 0 :(得分:25)

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

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

建议的解决方法是忽略警告(如果您当然不需要这些时区):

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

使用--force选项导入TZ数据后,您将可以使用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)

答案 1 :(得分:2)

不幸的是,Sylvain的解决方案对我没有用。

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

由于脚本太长而无法在帖子中共享,因此我会将其托管在我的Google云端硬盘上。

安装脚本(删除了新行和注释):

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秒。

注意:您可能需要以root身份运行才能实现此目的。