更改 MySQL 中的连接时区

Posted

技术标签:

【中文标题】更改 MySQL 中的连接时区【英文标题】:Changing the connection timezone in MySQL 【发布时间】:2011-07-27 11:21:13 【问题描述】:

我的服务器运行在MDT

所以我用下面一个来转换EST

SET  time_zone = '-5:00'

但是,我怎么能把它切换到EDT,因为

While `EST` is only valid in winter, while in summer how to change it to `EDT`

我只是尝试使用命名时区。但我收到以下错误

 #1298 - Unknown or incorrect time zone: 'America/Toronto'

我不明白如何解决这个问题

如何切换

UTC -05 到 UTC-04

【问题讨论】:

【参考方案1】:

对于 Linux、BSD 和 Mac OS X,如果您需要加载时区表,请执行以下操作:

$ mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -uroot mysql

【讨论】:

这也是我解决问题的方法。以下页面描述了此过程:dev.mysql.com/doc/refman/5.5/en/time-zone-support.html 我认为您应该在-uroot 之后添加-p 选项以使用root 密码 它给了我警告警告:无法将“/usr/share/zoneinfo/iso3166.tab”加载为时区。跳过它【参考方案2】:

由于您使用的是 Windows,因此您必须将时区描述表导入您的 MySQL 服务器。

http://dev.mysql.com/downloads/timezones.html

【讨论】:

这不仅限于 Windows,在 Ubuntu 上,我还必须按照此处 ***.com/questions/5510052/… 中的说明加载时区表 我的环境(OS X,Mysql 5.6.13)给了我一个模糊的错误“第 38916 行的错误 1406 (22001):第 1 行的“缩写”列的数据太长”。我通过运行mysql_tzinfo_to_sql /usr/share/zoneinfo | sed 's/Local time zone must be set--see zic manual page/(ERROR)/' | mysql -uroot mysql 绕过它(另见bugs.mysql.com/bug.php?id=68861)【参考方案3】:

对于我在 Windows 上使用 WampServer

从https://dev.mysql.com/downloads/timezones.html下载POSIX版本 解压 将所有文件放入wamp mysql data:C:\wamp\bin\mysql\mysql5.7.11\data\mysql 重启 wamp

更多信息:

“要为 MyISAM 时区表使用包含 .frm、.MYD 和 .MYI 文件的时区包,请下载并解压缩它。这些表文件是 mysql 数据库的一部分,因此您应该将这些文件放在 MySQL 服务器数据目录的 mysql 子目录中。在执行此操作之前停止服务器,然后重新启动它”

http://dev.mysql.com/doc/refman/5.7/en/time-zone-support.html#time-zone-installation

【讨论】:

【参考方案4】:

如果是 Mysql8 并想设置 EDT 时区 'America/New_York',请按照以下步骤操作:

    转到 /etc/my.cnf 在 [mysqld] 下添加 default-time-zone='America/New_York' systemctl 重启 mysqld

如果您遇到这样的致命错误:

Fatal error: Illegal or unknown default time zone

然后执行以下步骤:

    首先从 /etc/my.cnf 文件中删除 default-time-zone='America/New_York'

    的条目

    转到shell(从mysql退出)并运行命令

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

    再次添加该行

    重启mysql

【讨论】:

这对我有用。在Ubuntu上,my.cnf位于/etc/mysql/my.cnf,重启sudo service mysql restart,确认SELECT @@global.time_zone;【参考方案5】:

您是否尝试过使用诸如“America/New_York”之类的区域信息名称来代替缩写(仅在一半时间内有效)?

理想情况下,您当然不应该使用服务器时区 - 以 UTC 存储日期,然后在客户端代码中将其转换为适当的时区。 (请注意,这确实取决于您存储的内容。具有时区的用户指定的未来日期/时间值应该以这种方式存储,而不是转换为任何其他时区,以防万一规则在现在和未来的日期/时间之间发生变化。但是对于机器记录的即时时间,例如日志记录、事务等,我肯定会存储 UTC。我永远不会建议存储“只存储本地时间并假设服务器和客户端有相同的规则”。)

【讨论】:

我尝试了 SET time_zone = 'America/New_York' 但它不起作用,我生成错误 #1298 - 未知或不正确的时区:'America/New_York' @gowri:在不知道如何将数据插入数据库(例如,哪种语言/平台)的情况下,很难知道在 UTC 存储方面有什么建议。至于有效时区 - 我相信这取决于操作系统;您使用的是哪个操作系统? 我用的是php,oc是windows xp,server wamp @gowri:如果您能找到纽约的 Windows 时区 ID,您可能会发现它有效。我不知道。至于 UTC ......你想插入当前时间吗?如果是这样,请使用 UTCTIMESTAMP()。或者,只需将时区设置为“UTC”就可以满足您的需要... @MartinZvarík:不,确实如此,如果您存储的是当地时间。假设您在伦敦并记录这两个交易当地时间:“2019-10-27T01:45:00”和“2019-10-27T01:15:00”。你会如何安排那些时间?毫无疑问,您不能 - 因为由于 DST 过渡,凌晨 1 点和凌晨 2 点之间的时间在 2019 年 10 月 27 日在伦敦出现了两次。出于完全相同的原因,您也不能明确地将其转换为另一个时区。这只是复杂时区的一个方面。还有更多,其中大部分是我在创作 NodaTime 时了解到的......【参考方案6】:

为了完整起见,Mac 用户可以在/usr/local/mysql/bin 目录中找到mysql_tzinfo_to_sql 实用程序。

因此完整的命令将是/usr/local/mysql/bin/mysql_tzinfo_to_sql /usr/share/zoneinfo | ./mysql -p -u root mysql

我花了几个小时才找到这个实用程序,上面的路径可能会拯救你的!

【讨论】:

以上是关于更改 MySQL 中的连接时区的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 MySQL 数据库中的时区

一劳永逸解决IDEA 2019.3连接MySQL80时区(serverTimezone)问题

JPA 和服务器时区错误

从 phpMyAdmin 更改 mysql 时区

mysql更改时区

MySQL时区更改?