convert_tz gibt null zurück

92

Ich weiß, das klingt dumm, aber wenn ich benutze

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

es gibt NULL aus. Ich verwende MySQL Workbench in Ubuntu 12.04 64-Bit und es funktioniert in meinem anderen Laptop / Betriebssystem (auch mit MySQL Workbench).

Mohur
quelle

Antworten:

171

Dies geschieht, wenn Sie die Zeitzonentabelle nicht in MySQL geladen haben.

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
Barmar
quelle
1
Müssen Sie dies nur einmal oder jedes Mal tun, wenn MySql gestartet wird?
Abe Miessler
3
Nur einmal. Es lädt die Informationen in eine Tabelle in MySQL, die von da an verwendet wird.
Barmar
2
Mit dem Force-Flag können Sie auch alle Fehler überschreiben, auf die Sie stoßen: mysql_tzinfo_to_sql / usr / share / zoneinfo | mysql -u root --force -p mysql
Abschaum
3
Ich musste auch den MySQL-Daemon neu starten, bevor er in Kraft treten würde (unter Debian).
Ekster
2
Hallo, wenn ich diesen Befehl ausführe, wird folgende Fehlermeldung angezeigt: Warnung: '/usr/share/zoneinfo/iso3166.tab' kann nicht als Zeitzone geladen werden. Überspringen. Warnung: '/usr/share/zoneinfo/zone.tab' kann nicht als Zeitzone geladen werden. Überspringen.
Ghanshyam Katriya
25

Ich fand diesen Thread, nachdem ich einige Zeit damit verbracht hatte herauszufinden, warum der Befehl nach dem Ausführen des Befehls in der akzeptierten Antwort (die auf der Dev-Site von MySQL identisch ist) nicht zwischen Zeitzonen wie z

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

Es stellt sich heraus, dass unter OS X zwei Dateien Probleme verursachen: /usr/share/zoneinfo/Factoryund /usr/share/zoneinfo/+VERSION.

Das Update ... verschiebt diese Dateien vorübergehend an einen anderen Speicherort, z. B. /usr/share/zoneinfo/.bak/ermöglicht den Befehl

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

um alle erwarteten Zeitzoneninformationen vollständig auszufüllen.

Dies kann ein Fehler in meiner installierten Version von MySQL sein oder auch nicht:

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

Ich bin auch in tätig STRICT_MODE.

Auf jeden Fall hoffe ich, dass dies ein paar Kopfschmerzen für jeden erspart, der nach dem Fix sucht.

Jim Schubert
quelle
13

Abgesehen von der Windows-Umgebung können Sie die Zeitzone nach festlegen

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

In der Windows- Umgebung

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 (dh C: \ Programme \ MySQL \ data \ mysql) `

4. Start MySQL server

..Ihre Arbeit ist beendet ..

Wenn Sie immer noch NULLzum CONVERT_TZ Herunterladen dieser Datenbanktabellen und Einfügen in die MySQL-Datenbank http://www.4shared.com/folder/Toba2qu-/Mysql_timezone.html

Jetzt wird dein Problem gelöst .. :)

Rakesh
quelle
2

Wenn Sie MySQL unter Windows verwenden, müssen Sie die Zeitzonendaten in das MySQL-Schema laden. Hier ist ein gutes HOWTO: http://www.geeksengine.com/article/populate-time-zone-data-for-mysql.html

Wenn Sie dies nicht tun, erkennt die Funktion CONVERT_TZ Ihre Eingabezeitzone nicht (dh Ihre Beispiele: 'UTC', 'Asia / Jakarta') und gibt einfach NULL zurück.

Domenic D.
quelle
2

MAMP PRO

  1. Öffnen 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/
Jaseem Abbas
quelle
Abgesehen vom Speicherort des Binärordners gilt dies im Allgemeinen für macOS. Vielen Dank!
Oberstklick
2

1) In Windows befindet sich derzeit kein Datenordner C:\Program Files\MySQL\wie in anderen Antworten.

2) Suchen Sie in diesem Fall nach C:\ProgramData\MySQL\MySQL Server 5.x\Data\mysql. Im Allgemeinen ist dieser Ordner ausgeblendet und wird C:\ProgramData\manchmal nicht angezeigt .

3) Ändern Sie die Registerkarte Einstellungen in Ansicht, um ausgeblendete Dateien und Ordner anzuzeigen, wie hier erläutert: https://irch.info/index.php?pg=kb.page&id=133

4) Beenden Sie den MySQL-Dienst, indem Sie auf der Windows-Schaltfläche Start nach "Dienste" suchen.

5) Entpacken Sie dann die Datei timezone_2017c_posix.zip und kopieren Sie die darin enthaltenen Dateien (kopieren Sie die Dateien direkt, kopieren Sie nicht den gesamten Ordner selbst) und fügen Sie sie ein C:\ProgramData\MySQL\MySQLServer5.x\Data\mysql\

6) Für MySQL 5.7 gibt timezone_2017c_posix.zip nach dem Entpacken nur eine .sql-Datei aus und kann das Problem möglicherweise nicht lösen. Laden Sie also die Zip-Datei für 5.6 herunter, auch wenn Sie MySQL 5.7 ausführen, und kopieren Sie diese Dateien nachC:\ProgramData\MySQL\MySQL Server 5.x\Data\mysql\

7) Starten Sie den MySQL-Server neu. Führen Sie diese SQL-Abfrage aus, um zu überprüfen, ob CONVERT_TZ () funktioniert.

SELECT CONVERT_TZ('2004-01-01 12:00:00','UTC','Asia/Jakarta'); und auf Nicht-Null-Ausgabe prüfen.

Shanu
quelle
1
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

Wenn Sie den Fehler erhalten, data too long for column 'abbreviation' at row 1 lesen Sie: https://bugs.mysql.com/bug.php?id=68861

Die Lösung wäre, Folgendes auszuführen

Dadurch wird eine Zeile hinzugefügt, um den MySQL-Modus zu deaktivieren und MySQL zu ermöglichen, abgeschnittene Daten einzufügen. Dies lag an einem MySQL-Fehler, bei dem MySQL am Ende ein Nullzeichen hinzufügte (gemäß dem obigen Link).

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
Timo Huovinen
quelle
Ich habe OSX El Capitan und dies ist die einzige Antwort, um es zum Laufen zu bringen. Zum späteren Nachschlagen: In meinem Fall lautet der Fehler: "Daten zu lang für Spalte 'Abkürzung' in Zeile 1". Hinweis: Alle Bemühungen, (sudo) mkdir oder (sudo) mv der in anderen Antworten genannten Dateien
auszuführen,
Übrigens musste ich MySQL nicht neu starten.
Hepabolu
1

Dies sind die Schritte, damit es funktioniert, wenn Sie sich in Windows befinden und MySQL 5.7 verwenden.

  1. Klicken Sie mit der rechten Maustaste auf Arbeitsplatz / Computer / Dieser PC oder wie auch immer der Name in Ihrem Betriebssystem lautet, und wählen Sie Eigenschaften.
  2. Wählen Sie im linken Bereich "Erweiterte Systemeinstellungen".
  3. Wählen Sie "Umgebungsvariablen" und geben Sie den vollständigen Pfadnamen Ihres MySQL-Bin-Verzeichnisses ein (im Allgemeinen befindet es sich in C: \ Programme \ MySQL \ MySQL Server 5.7 \ bin).
  4. Öffnen Sie die Eingabeaufforderung cmd und geben Sie mysql mit ein mysql -u root -p password.
  5. Geben Sie ein use mysql, um die MySQL-Datenbank auszuwählen.
  6. Laden Sie die Datei "timezone_YYYYc_posix_sql.zip" (anstelle von YYYY das auf dieser Seite maximal verfügbare Jahr wie 2017 oder 2018 ersetzen) von https://dev.mysql.com/downloads/timezones.html herunter .
  7. Extrahieren Sie es und öffnen Sie die Datei im Texteditor.
  8. Kopieren Sie den Inhalt und führen Sie ihn in der Eingabeaufforderung cmd aus.

Nach erfolgreichem Abschluss sollten Sie in der Lage sein, CONVERT_TZandere Zeitzonenfunktionen zu verwenden.

Fremder
quelle
0

Unter Mac OS Catalina bei Verwendung von XAMPP

Gehen Sie im Terminal zum Ordner / Applications / XAMPP / xamppfiles / bin und führen Sie die folgenden Schritte aus.

./mysql_tzinfo_to_sql / usr / share / zoneinfo | sed -e "s / Lokale Zeitzone muss eingestellt sein - siehe zic Handbuchseite / local /" | ./mysql -u root mysql

Das hat bei mir funktioniert.

Rem
quelle