【问题标题】:convert_tz returns nullconvert_tz 返回 null
【发布时间】:2013-01-05 10:22:38
【问题描述】:

我知道这听起来很愚蠢,但是当我使用时

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

它输出 NULL。我在 Ubuntu 12.04 64 位中使用 MySQL Workbench,它适用于我的其他笔记本电脑/操作系统(也使用 MySQL Workbench)。

【问题讨论】:

    标签: mysql ubuntu-12.04 convert-tz


    【解决方案1】:

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

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

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

    【讨论】:

    • 只有一次。它将信息加载到 MySQL 的表中,从那时起使用。
    • 您也可以使用 force 标志来覆盖您遇到的任何错误:mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root --force -p mysql
    • 我还需要重新启动 MySQL 守护程序才能生效(在 Debian 上)。
    • 嗨,当我运行此命令时,我收到如下错误:警告:无法将“/usr/share/zoneinfo/iso3166.tab”作为时区加载。跳过它。警告:无法将“/usr/share/zoneinfo/zone.tab”加载为时区。跳过它。
    • @TheGodfather 是的,这并不明显。这就是为什么我总是喜欢使用--database mysql 来表示超级明确。
    【解决方案2】:

    我花了一些时间试图弄清楚为什么在接受的答案中运行命令后(在 MySQL 的开发站点上也是如此)命令无法在时区之间转换,例如

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

    事实证明,在 OS X 上有两个文件会导致问题:/usr/share/zoneinfo/Factory/usr/share/zoneinfo/+VERSION

    修复...暂时将这些文件移动到不同的位置,例如 /usr/share/zoneinfo/.bak/ 允许该命令

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

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

    这可能是我安装的 MySQL 版本中的错误,也可能不是:

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

    我也在STRICT_MODE工作。

    无论如何,我希望这可以为任何寻找修复程序的人省去一些麻烦。

    【讨论】:

      【解决方案3】:

      除了Windows环境,你可以设置时区

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

      Windows环境中,

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

      2. Stop MySQL server

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

      4. Start MySQL server

      ..你的工作已经完成了..

      如果您仍然收到NULLCONVERT_TZ 下载这些数据库表,插入mysql数据库http://www.4shared.com/folder/Toba2qu-/Mysql_timezone.html

      现在你的问题将得到解决.. :)

      【讨论】:

        【解决方案4】:

        MAMP 专业版

        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/

        【讨论】:

        • 除了二进制文件夹的位置,这通常适用于 macOS。谢谢!
        【解决方案5】:

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

        2) 在这种情况下,请查找 C:\ProgramData\MySQL\MySQL Server 5.x\Data\mysql。通常这个文件夹是隐藏的,有时你不会看到C:\ProgramData\

        3) 更改“查看”选项卡中的“设置”以查看隐藏文件和文件夹,如下所述https://irch.info/index.php?pg=kb.page&id=133

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

        5) 然后解压timezone_2017c_posix.zip 然后复制里面的文件(直接复制文件,不要自己复制整个文件夹),粘贴进去 C:\ProgramData\MySQL\MySQLServer5.x\Data\mysql\

        6) 对于 MySQL 5.7,timezone_2017c_posix.zip 在解压后只会给出一个 .sql 文件,它可能无法解决问题。因此,即使您正在运行 MySQL 5.7,也请继续下载 5.6 的 zip 文件并将这些文件复制到 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'); 并检查非空输出。

        【讨论】:

          【解决方案6】:

          如果您在 Windows 中并使用 MySQL 5.7,这些是使其工作的步骤。

          1. 右键单击我的电脑/计算机/这台电脑或操作系统中的任何名称,然后选择属性。
          2. 从左侧面板中选择“高级系统设置”。
          3. 选择“环境变量”,输入你的MySQL bin目录的完整路径名(一般在C:\Program Files\MySQL\MySQL Server 5.7\bin)。
          4. 打开cmd提示符,使用mysql -u root -p password进入mysql。
          5. 输入 use mysql 选择 MySQL 数据库。
          6. https://dev.mysql.com/downloads/timezones.html 下载文件“timezone_YYYYc_posix_sql.zip”(代替 YYYY,替换该页面中可用的最大年份,如 2017 年或 2018 年)。
          7. 解压并在文本编辑器中打开文件。
          8. 复制内容并在cmd提示符下执行。

          成功完成后,您应该可以使用CONVERT_TZ 和其他时区功能。

          【讨论】:

            【解决方案7】:

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

            如果您不这样做,函数 CONVERT_TZ 将无法识别您输入的时区(即您的示例:'UTC'、'Asia/Jakarta'),并且只会返回 NULL。

            【讨论】:

              【解决方案8】:
              mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
              

              如果您收到错误 data too long for column 'abbreviation' at row 1 然后看:https://bugs.mysql.com/bug.php?id=68861

              解决方法是运行以下命令

              这将添加一行来禁用 mysql 模式并允许 mysql 插入截断的数据 这是因为一个 mysql 错误,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
              

              【讨论】:

              • 我有 OSX El Capitan,这是让它工作的唯一答案。供将来参考:在我的情况下,错误状态是:“第 1 行的“缩写”列的数据太长”。注意:对其他答案中提到的文件执行 (sudo) mkdir 或 (sudo) mv 的所有努力都会导致“权限被拒绝”
              • 顺便说一句,我不需要重新启动 MySQL。
              【解决方案9】:

              在 Mac OS Catalina 上使用 XAMPP 时,

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

              ./mysql_tzinfo_to_sql /usr/share/zoneinfo | sed -e "s/必须设置本地时区--参见zic手册页/local/" | ./mysql -u root mysql

              这对我有用。

              【讨论】:

                猜你喜欢
                • 2015-12-28
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-06-28
                • 1970-01-01
                • 1970-01-01
                • 2011-02-01
                相关资源
                最近更新 更多