Convert_tz zwraca null

95

Wiem, że to brzmi głupio, ale kiedy używam

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

wyprowadza NULL. Używam MySQL Workbench w Ubuntu 12.04 64 bit i działa na moim innym laptopie / systemie operacyjnym (również używając MySQL Workbench).

mohur
źródło

Odpowiedzi:

180

Stanie się tak, jeśli nie załadowałeś tabeli stref czasowych do mysql.

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

mysql to nazwa wbudowanej bazy danych, która przechowuje dane konfiguracyjne specyficzne dla MySQL.

Barmar
źródło
1
Czy musisz to zrobić tylko raz, czy za każdym razem, gdy MySql uruchamia się?
Abe Miessler
3
Tylko raz. Ładuje informacje do tabeli w MySQL, która jest używana od tej pory.
Barmar
2
Możesz użyć flagi force, aby nadpisać wszelkie napotkane błędy: mysql_tzinfo_to_sql / usr / share / zoneinfo | mysql -u root --force -p mysql
scum
3
Musiałem również zrestartować demona MySQL, zanim zacząłby obowiązywać (w Debianie).
Ekster,
3
Cześć, po uruchomieniu tego polecenia wystąpił następujący błąd: Ostrzeżenie: Nie można załadować „/usr/share/zoneinfo/iso3166.tab” jako strefy czasowej. Pomijam to. Ostrzeżenie: nie można załadować „/usr/share/zoneinfo/zone.tab” jako strefy czasowej. Pomijam to.
Ghanshyam Katriya
26

Znalazłem ten wątek po tym, jak spędziłem trochę czasu próbując dowiedzieć się, dlaczego po uruchomieniu polecenia w zaakceptowanej odpowiedzi (która jest taka sama na stronie deweloperów MySQL) polecenie nie było w stanie dokonać konwersji między strefami czasowymi, takimi jak

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

Okazuje się, że na OS X są dwa pliki, które powodują problemy: /usr/share/zoneinfo/Factoryi /usr/share/zoneinfo/+VERSION.

Poprawka ... tymczasowe przeniesienie tych plików do innej lokalizacji, na przykład /usr/share/zoneinfo/.bak/zezwala na polecenie

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

aby w pełni wypełnić wszystkie oczekiwane informacje o strefie czasowej.

Może to być błąd w mojej zainstalowanej wersji MySQL lub nie:

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

Działam również w STRICT_MODE .

W każdym razie mam nadzieję, że zaoszczędzi to kilku kłopotów każdemu, kto szuka poprawki.

Jim Schubert
źródło
13

Oprócz środowiska Windows możesz ustawić strefę czasową za pomocą

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

W środowisku 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 (tj. C: \ Program Files \ MySQL \ data \ mysql) `

4. Start MySQL server

.. Twoja praca jest zakończona.

Jeśli nadal otrzymujesz NULLza CONVERT_TZ Pobierz te tabele bazy danych i wstaw je do bazy danych mysql http://www.4shared.com/folder/Toba2qu-/Mysql_timezone.html

Teraz twój problem zostanie rozwiązany .. :)

Rakesh
źródło
2

Jeśli używasz MySql w systemie Windows, musisz załadować dane strefy czasowej do schematu mysql. Oto dobre HOWTO: http://www.geeksengine.com/article/populate-time-zone-data-for-mysql.html

Jeśli tego nie zrobisz, funkcja CONVERT_TZ nie rozpozna Twojej strefy czasowej (np. „UTC”, „Azja / Dżakarta”) i zwróci po prostu NULL.

Domenic D.
źródło
2

MAMP PRO

  1. otwarty 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
źródło
Poza lokalizacją folderu binarnego dotyczy to ogólnie systemu macOS. Dzięki!
pułkownik kliknij
2

1) W systemie Windows nie ma teraz żadnego folderu danych, C:\Program Files\MySQL\jak w innych odpowiedziach.

2) W takim przypadku poszukaj C:\ProgramData\MySQL\MySQL Server 5.x\Data\mysql. Ogólnie ten folder jest ukryty i C:\ProgramData\czasami nie zobaczysz .

3) Zmień ustawienia na karcie Widok, aby zobaczyć ukryte pliki i foldery, jak wyjaśniono tutaj https://irch.info/index.php?pg=kb.page&id=133

4) Zatrzymaj usługę MySQL, wyszukując „usługi” w przycisku Start systemu Windows.

5) Następnie rozpakuj plik timezone_2017c_posix.zip, a następnie skopiuj znajdujące się w nim pliki (skopiuj pliki bezpośrednio, nie kopiuj całego folderu) i wklej w C:\ProgramData\MySQL\MySQLServer5.x\Data\mysql\

6) W przypadku MySQL 5.7, timezone_2017c_posix.zip po rozpakowaniu poda plik .sql i może nie rozwiązać problemu. Więc śmiało pobierz plik zip dla wersji 5.6, nawet jeśli używasz MySQL 5.7 i skopiuj te pliki doC:\ProgramData\MySQL\MySQL Server 5.x\Data\mysql\

7) Uruchom ponownie serwer MySQL. Aby sprawdzić, czy CONVERT_TZ () działa, uruchom to zapytanie sql.

SELECT CONVERT_TZ('2004-01-01 12:00:00','UTC','Asia/Jakarta'); i sprawdź, czy dane wyjściowe nie są zerowe.

shanu
źródło
1
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

jeśli data too long for column 'abbreviation' at row 1 pojawi się błąd, zobacz: https://bugs.mysql.com/bug.php?id=68861

rozwiązaniem byłoby uruchomienie następującego

spowoduje to dodanie linii wyłączającej tryb mysql i umożliwiającej mysql wstawianie obciętych danych, było to spowodowane błędem mysql, w którym mysql dodałby znak null na końcu (zgodnie z powyższym linkiem)

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
źródło
Mam OSX El Capitan i to jedyna odpowiedź, aby to zadziałało. Na przyszłość: w moim przypadku komunikat o błędzie brzmi: „Dane za długie dla kolumny„ Skrót ”w wierszu 1”. Uwaga: wszystkie wysiłki, aby wykonać (sudo) mkdir lub (sudo) mv z plików wymienionych w innych odpowiedziach, skutkują
`` Odmową
BTW nie musiałem restartować MySQL.
hepabolu
1

Oto kroki, aby to działało, jeśli jesteś w systemie Windows i używasz MySQL 5.7.

  1. Kliknij prawym przyciskiem myszy Mój komputer / Komputer / Ten komputer lub jakąkolwiek nazwę w systemie operacyjnym i wybierz Właściwości.
  2. Wybierz „Zaawansowane ustawienia systemu” z lewego panelu.
  3. Wybierz „Zmienne środowiskowe”, wprowadź pełną nazwę ścieżki do katalogu bin MySQL (zazwyczaj będzie to C: \ Program Files \ MySQL \ MySQL Server 5.7 \ bin).
  4. Otwórz znak zachęty cmd, wejdź do mysql za pomocą mysql -u root -p password.
  5. Enter, use mysqlaby wybrać bazę danych MySQL.
  6. Pobierz plik „timezone_YYYYc_posix_sql.zip” (zamiast RRRR zastąp maksymalny rok dostępny na tej stronie, np. 2017 lub 2018) ze strony https://dev.mysql.com/downloads/timezones.html .
  7. Wyodrębnij go i otwórz plik w edytorze tekstu.
  8. Skopiuj zawartość i wykonaj polecenie cmd.

Po pomyślnym zakończeniu powinieneś móc używać CONVERT_TZi innych funkcji strefy czasowej.

Nieznajomy
źródło
0

W systemie Mac OS Catalina podczas korzystania z XAMPP,

Przejdź do folderu / Applications / XAMPP / xamppfiles / bin w Terminalu, a następnie uruchom następujące.

./mysql_tzinfo_to_sql / usr / share / zoneinfo | sed -e "s / Lokalna strefa czasowa musi być ustawiona - zobacz stronę podręcznika zic / local /" | ./mysql -u root mysql

To zadziałało dla mnie.

Rem
źródło