sql >> Databáze >  >> RDS >> MariaDB

Jak nastavit pojmenovaná časová pásma v MariaDB

Pokud chcete v MariaDB používat pojmenovaná časová pásma, musíte se ujistit, že jsou nakonfigurována.

„Pojmenovaná časová pásma“ mám na mysli schopnost používat řetězce jako America/Los_Angeles místo −08:00 nebo −07:00 při zadávání časového pásma. Například při použití CONVERT_TZ() funkce.

Zde je návod, jak nakonfigurovat pojmenovaná časová pásma v MariaDB.

Tabulky časových pásem

MariaDB má v mysql následující tabulky časových pásem databáze:

  • time_zone
  • time_zone_leap_second
  • time_zone_name
  • time_zone_transition
  • time_zone_transition_type

Ve výchozím nastavení jsou tyto tabulky vytvořeny, ale nejsou naplněny.

Chcete-li použít pojmenovaná časová pásma, musíte tyto tabulky naplnit. Způsob, jak to provést, bude záviset na vašem systému (tj. zda váš systém skutečně obsahuje informace o časovém pásmu).

Systémy podobné Unixu

Důvod, proč jsou výše uvedené tabulky časových pásem ve výchozím nastavení prázdné, je ten, že je obvykle lepší, aby systém zpracovával časové pásmo, pokud je to možné.

Většina systémů podobných Unixu, jako je Linux, Mac OS X, FreeBSD a Solaris, má databázi zoneinfo. Tuto databázi zoneinfo lze načíst do tabulek časových pásem v MariaDB pomocí mysql_tzinfo_to_sql utility.

Pokud váš systém obsahuje databázi zoneinfo, je vhodnější použít tuto metodu k naplnění tabulek časových pásem. Jinak můžete způsobit rozdíl ve zpracování data a času mezi MariaDB a jinými aplikacemi ve vašem systému.

Chcete-li načíst tabulky časových pásem, otevřete okno terminálu a spusťte následující:

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

Zadejte heslo pro root uživatel. Pokud se zobrazí chyba „přístup odepřen“, podívejte se na tuto opravu.

A je to. Tabulky časových pásem by nyní měly být vyplněny.

V mém případě jsem dostal jedno varování:

Warning: Unable to load '/usr/share/zoneinfo/leapseconds' as time zone. Skipping it.

Toto varování lze bezpečně ignorovat.

Toto varování je pravděpodobně způsobeno skutečností, že systémy podobné Unixu nezahrnují přestupné sekundy. To znamená, že systémy podobné Unixu nemají žádný způsob, jak reprezentovat skokovou sekundu ve formě 23:59:60 . Místo toho používá stejnou sekundu dvakrát.

To dodržuje standard POSIX (Portable Operating System Interface), který vyžaduje, aby z hlášeného času byly vynechány přestupné sekundy.

Windows, systémy HP-UX

Některé systémy, jako jsou Windows a HP-UX, nemají databázi zoneinfo, takže pokud používáte tyto operační systémy, budete muset načíst tabulky časových pásem pomocí skriptu SQL.

Skripty a pokyny k instalaci najdete v dokumentaci k MySQL.

Zkontrolujte tabulky časových pásem

Jakmile jsou tabulky časových pásem naplněny, můžeme spustit rychlý dotaz, abychom zkontrolovali, že jsou skutečně naplněny.

Příklad:

SELECT * 
FROM mysql.time_zone_name
LIMIT 10;

Výsledek:

+--------------------+--------------+
| Name               | Time_zone_id |
+--------------------+--------------+
| Africa/Abidjan     |            1 |
| Africa/Accra       |            2 |
| Africa/Addis_Ababa |            3 |
| Africa/Algiers     |            4 |
| Africa/Asmara      |            5 |
| Africa/Asmera      |            6 |
| Africa/Bamako      |            7 |
| Africa/Bangui      |            8 |
| Africa/Banjul      |            9 |
| Africa/Bissau      |           10 |
+--------------------+--------------+

V tomto případě jsem vybral 10 nejlepších výsledků z time_zone_name stůl.

Zde je úplný počet:

SELECT COUNT(*) 
FROM mysql.time_zone_name;

Výsledek:

+----------+
| COUNT(*) |
+----------+
|      594 |
+----------+

Ostatní tabulky můžete procházet podle potřeby.


  1. Omezení paměti v SQL Server 2016 SP1

  2. Zobrazení historie úloh SQL Server Agent pomocí Azure Data Studio

  3. Vyplnění zobrazené hodnoty položky na dotaz v Oracle Forms

  4. Jak mohu napsat SQL pro tabulku, která sdílí stejný název jako chráněné klíčové slovo v MySql?