我知道这听起来很愚蠢,但是当我使用
SELECT CONVERT_TZ('2004-01-01 12:00:00','UTC','Asia/Jakarta') AS time
它输出NULL。我在 Ubuntu 12.04 64 位中使用 MySQL Workbench,它适用于我的其他笔记本电脑/操作系统(也使用 MySQL Workbench)。
我知道这听起来很愚蠢,但是当我使用
SELECT CONVERT_TZ('2004-01-01 12:00:00','UTC','Asia/Jakarta') AS time
它输出NULL。我在 Ubuntu 12.04 64 位中使用 MySQL Workbench,它适用于我的其他笔记本电脑/操作系统(也使用 MySQL Workbench)。
如果您尚未将时区表加载到 mysql 中,则会发生这种情况。
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
mysql
是保存 MySQL 特定配置数据的内置数据库的名称。
我花了一些时间试图弄清楚为什么在接受的答案(这在 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
。
无论如何,我希望这可以为任何寻找修复程序的人省去一些麻烦。
除了 Windows 环境,您可以通过以下方式设置时区
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
在Windows环境下,
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
(即 C:\Program Files\MySQL\data\mysql)`
4. Start MySQL server
..你的工作完成了..
如果您仍然NULL
需要CONVERT_TZ
下载这些数据库表并将其插入 mysql 数据库http://www.4shared.com/folder/Toba2qu-/Mysql_timezone.html
现在你的问题将得到解决.. :)
MAMP PRO
Terminal
cd /usr/share/zoneinfo/
sudo mv +VERSION ~/Desktop
cd /applications/MAMP/Library/bin
sudo ./mysql_tzinfo_to_sql /usr/share/zoneinfo | ./mysql -p -u root mysql
sudo mv ~/Desktop/+VERSION /usr/share/zoneinfo/
如果您在 Windows 中并使用 MySQL 5.7,这些是使其工作的步骤。
mysql -u root -p password
.use mysql
以选择 MySQL 数据库。成功完成后,您应该能够使用CONVERT_TZ
和其他时区功能。
C:\Program Files\MySQL\
1)在 Windows 中,与其他答案一样,现在没有任何数据文件夹。
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');
并检查非空输出。
如果您在 Windows 上使用 MySql,则必须将时区数据加载到 mysql 架构中。这是一个很好的 HOWTO:http ://www.geeksengine.com/article/populate-time-zone-data-for-mysql.html
如果您不这样做,函数 CONVERT_TZ 将无法识别您输入的时区(即您的示例:'UTC'、'Asia/Jakarta'),并且只会返回 NULL。
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
在 Mac OS Catalina 上使用 XAMPP 时,
转到终端中的 /Applications/XAMPP/xamppfiles/bin 文件夹,然后运行以下命令。
./mysql_tzinfo_to_sql /usr/share/zoneinfo | sed -e "s/必须设置本地时区--参见zic手册页/local/" | ./mysql -u 根mysql
这对我有用。