Convert_tz 返回 null

我知道这听起来很蠢,但是当我吸毒的时候

SELECT CONVERT_TZ('2004-01-01 12:00:00','UTC','Asia/Jakarta') AS time

它输出 NULL。我在 Ubuntu 12.0464位中使用 MySQL Workbench,它可以在我的其他笔记本/操作系统中工作(也使用 MySQL Workbench)。

56551 次浏览

如果没有将时区表加载到 mysql 中,就会发生这种情况。

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

mysql是保存 MySQL 特定配置数据的内置数据库的名称。

如果在 Windows 上使用 MySql,则必须将时区数据加载到 MySql 模式中。这是一个很好的方法: http://www.geeksengine.com/article/populate-time-zone-data-for-mysql.html

If you don't do this, the function CONVERT_TZ won't recognize your input timezone (i.e. your examples: 'UTC','Asia/Jakarta'), and will simply return NULL.

我发现这个线程后,花了一些时间试图找出为什么在运行命令后,在接受的答案(这是相同的 MySQL 的开发站点)命令无法转换之间的时区,如

SELECT CONVERT_TZ('2004-01-01 12:00:00','UTC','MET') AS time

事实证明,在 OSX 上有两个引起问题的文件: /usr/share/zoneinfo/Factory/usr/share/zoneinfo/+VERSION

The fix... temporarily moving these files to a different location such as /usr/share/zoneinfo/.bak/ allows for the command

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

完全填充所有预期的时区信息。

这可能是也可能不是我安装的 MySQL 版本中的一个 bug:

$ mysql --version
mysql  Ver 14.14 Distrib 5.6.11, for osx10.6 (x86_64) using  EditLine wrapper

我也在 STRICT_MODE操作。

无论如何,我希望这可以为那些寻找补丁的人省去一些麻烦。

除 Windows 环境外,还可以通过以下方式设置时区

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

窗户环境下,

1. download Time zone description tables from http://dev.mysql.com/downloads/timezones.html

2. Stop MySQL server

3. Put then inside Mysql installation package (ie. C:\Program Files\MySQL\data\mysql)`

4. Start MySQL server

你的工作完成了。

如果你仍然得到 NULLCONVERT_TZ 下载这些数据库表并将其插入 mysql 数据库 < a href = “ http://www.4shared.com/file/Toba2qu-/mysql _ timezone.html”rel = “ norefrer”> http://www.4shared.com/folder/toba2qu-/mysql_timezone.html

Now you problem will be solved.. :)

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

如果你得到错误 data too long for column 'abbreviation' at row 1 然后参见: < a href = “ https://bugs.mysql.com/bug.php? id = 68861”rel = “ nofollow”> https://bugs.mysql.com/bug.php?id=68861

the fix would be to run the following

这将添加一行来禁用 mysql 模式,并允许 mysql 插入截断的数据 这是因为 mysql 的 bug,其中 mysql 会在结尾添加一个空字符(根据上面的链接)

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
(if the above gives error "data too long for column 'abbreviation' at row 1")
mysql_tzinfo_to_sql /usr/share/zoneinfo > /tmp/zut.sql


echo "SET SESSION SQL_MODE = '';" > /tmp/mysql_tzinfo_to.sql
cat /tmp/zut.sql >> /tmp/mysql_tzinfo_to.sql


mysql --defaults-file=/etc/mysql/my.cnf --user=verifiedscratch -p mysql < /tmp/mysql_tzinfo_to.sql

MAMP PRO

  1. 打开 Terminal
  2. cd /usr/share/zoneinfo/
  3. sudo mv +VERSION ~/Desktop
  4. cd /applications/MAMP/Library/bin
  5. sudo ./mysql_tzinfo_to_sql /usr/share/zoneinfo | ./mysql -p -u root mysql
  6. sudo mv ~/Desktop/+VERSION /usr/share/zoneinfo/

如果你在 Windows 中使用 MySQL 5.7,这些步骤可以帮助你实现。

  1. Right click on My Computer/Computer/This PC or whatever the name in your OS and choose Properties.
  2. 从左面板中选择“高级系统设置”。
  3. 选择“ Environmental Variables”,输入 MySQL bin 目录的完整路径名(通常位于 C: Program Files MySQL MySQL Server 5.7 bin)。
  4. Open cmd prompt, enter into mysql using mysql -u root -p password.
  5. 输入 use mysql以选择 MySQLDB。
  6. https://dev.mysql.com/downloads/timezones.html下载文件“ timezone _ YYYYc _ posx _ sql.zip”(代替 YYYY,替换该页面中可用的最大年份,如2017或2018)。
  7. 解压缩并在文本编辑器中打开该文件。
  8. 复制内容并在 cmd 提示符下执行。

成功完成后,您应该能够使用 CONVERT_TZ和其他时区函数。

1)在 Windows 中,现在 C:\Program Files\MySQL\中没有任何数据文件夹,就像在其他答案中一样。

2) In that case, look for C:\ProgramData\MySQL\MySQL Server 5.x\Data\mysql. Generally this folder hidden and you will not see C:\ProgramData\ some times.

3)更改“视图中的设置”选项卡,以查看这里解释的隐藏文件和文件夹

4)通过在 Windows 开始按钮中搜索“服务”来停止 MySQL 服务。

5)解压时区 _ 2017c _ posx.zip,然后复制其中的文件(直接复制文件,不要复制整个文件夹本身) ,然后粘贴 C:\ProgramData\MySQL\MySQLServer5.x\Data\mysql\

6)对于 MySQL 5.7,timezone _ 2017c _ posx.zip 只会给出一个。Sql 文件解压缩后,它可能无法解决这个问题。因此,请继续下载5.6版本的 zip 文件,即使您正在运行 MySQL 5.7并将这些文件复制到 C:\ProgramData\MySQL\MySQL Server 5.x\Data\mysql\

7)重新启动 MySQL 服务器。要检查 CONVERT _ TZ ()是否正常工作,运行这个 sql 查询。

SELECT CONVERT_TZ('2004-01-01 12:00:00','UTC','Asia/Jakarta'); 并检查非空输出。

On Mac OS Catalina when using XAMPP,

转到终端中的/Applications/XAMPP/xamppfiles/bin 文件夹,然后运行以下命令。

./mysql_tzinfo_to_sql /usr/share/zoneinfo | sed -e "s/Local time zone must be set--see zic manual page/local/" | ./mysql -u root mysql

这招对我很管用。