Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Zeitzonenabgleich mit SQL

1/3

go verwendet die Time Zone Database von IANA mit genauen Zonennamen. Der Versuch, zurückzuentwickeln, wie MySQL das lokale Zeitzonenformat von einem (Linux-)Host bestimmt, und diese Logik in einem go zu duplizieren Clients – wie @MattJohnson betonte – erweist sich als unzuverlässig.

2/3

database/sql.DB - erstellt über Open(drv, DSN) - verwendet denselben DSN für alle Anschlüsse. Während eine sql.DB soll einmal erstellt und viele Male verwendet werden - es gibt keine Möglichkeit, den DSN zu ändern im Nachhinein - also müsste man eine brandneue sql.DB erstellen beim Ändern des DSN .

3/3

Der bessere Weg scheint also, MySQL zu nutzen um alle datetime zu konvertieren Werte von der lokalen zur UTC-Zeitzone vor der Übertragung an den Client. Dadurch entfällt die komplizierte Einstellung der (möglicherweise unbekannten) Zeitzone der Datenbank zur Verbindungszeit über den DSN .

Eine vielversprechende Option besteht darin, die Sitzungszeitzone der Verbindung festzulegen:

  • SET @@session.time_zone = "+00:00";
  • das funktioniert aber nur für den aktuellen Verbindung (innerhalb des Verbindungspools). Ein go Der Kunde weiß jedoch nicht, welche kostenlose Verbindung er gerade verwendet.
  • Um sicherzustellen, dass dies immer funktioniert, müsste man es vor allen Abfragen manuell anwenden . Selbst wenn nur eine DB-Verbindung verwendet wird – wenn die Verbindung fehlschlägt und die Verbindungswiederholung beginnt – würde jeder vorherige Sitzungsstatus verloren gehen.

Also stattdessen alle datatime umschließen Spalten mit einer Konvertierungsfunktion wie folgt:

CONVERT_TZ(`STAMP_UPDATED`,@@session.time_zone,'+00:00')

stellt sicher, dass die Zeitzonenberechnung zur Abfragezeit erfolgt und nicht während einer Verbindungswiederverbindung usw. verloren geht.

Also jetzt der DSN loc muss nicht mehr angegeben werden - als UTC ist die Vorgabe. Genauer gesagt der DSN benötigt nur die Suffix-Option ?parseTime=true um datetime zuzulassen in go zu übersetzen 's native time.Time .

Schließlich und vor allem funktioniert dies mit jedem Server, der auf eine beliebige Zeitzone eingestellt ist.

H/T auf diese Antwort .