MySQL TIMESTAMP vysvětleno: použití, časová pásma a problém roku 2038

1. Co je MySQL TIMESTAMP?

V MySQL datový typ TIMESTAMP ukládá specifický bod v čase v UTC (Coordinated Universal Time) a automaticky se upravuje pro časovou zónu během ukládání a načítání. Tento datový typ může zpracovávat data a časy od 1. ledna 1970 do 19. ledna 2038. Při ukládání dat TIMESTAMP používá aktuální časovou zónu a při načítání se automaticky převádí zpět na základě systémové časové zóny.

Rozdíl mezi TIMESTAMP a DATETIME

Datový typ DATETIME se často porovnává s TIMESTAMP. Na rozdíl od TIMESTAMP ukládá DATETIME datum a čas přesně tak, jak byly zadány, bez převodů časových zón. Naproti tomu se TIMESTAMP při ukládání převádí na UTC a při načítání se upravuje zpět na systémovou časovou zónu, což pomáhá předcházet nesrovnalostem napříč časovými zónami.

Například TIMESTAMP je obzvláště užitečný při migraci systémů nebo správě databází napříč více časovými zónami. Mezitím DATETIME podporuje mnohem širší rozsah – od roku 1000 do 9999 – což ho činí vhodným pro vyhnutí se problému s rokem 2038.

Příklad použití TIMESTAMP

Můžete vytvořit tabulku s sloupcem TIMESTAMP takto:

CREATE TABLE events (
    id INT AUTO_INCREMENT PRIMARY KEY,
    event_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

V tomto příkladu sloupec event_time automaticky ukládá aktuální čas při vložení záznamu a aktualizuje časovou značku při každé úpravě záznamu.

2. Základní použití TIMESTAMP

Při používání TIMESTAMP v MySQL je důležité znát základní metody pro vkládání a načítání hodnot. Níže jsou uvedeny několik příkladů práce s TIMESTAMP.

Vložení specifického data a času

Při vkládání dat do sloupce TIMESTAMP obvykle zadáte datum a čas jako řetězec ve formátu YYYY-MM-DD hh:mm:ss.

INSERT INTO events (event_time) VALUES ('2023-10-01 12:30:00');

Tento SQL příkaz vloží 1. října 2023 v 12:30 dopoledne do sloupce event_time.

Vložení aktuálního času

Pomocí funkce MySQL NOW() můžete snadno vložit aktuální datum a čas. Tato funkce vrací aktuální systémový čas na základě nakonfigurované časové zóny.

INSERT INTO events (event_time) VALUES (NOW());

V tomto případě dotaz vloží přesnou aktuální časovou značku v okamžiku spuštění SQL.

Povolení automatických aktualizací

Přidáním ON UPDATE CURRENT_TIMESTAMP ke sloupci TIMESTAMP MySQL automaticky aktualizuje hodnotu sloupce při každé úpravě záznamu.

CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    order_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

Zde order_time ukládá aktuální časovou značku při prvním vytvoření záznamu a aktualizuje se při každé úpravě řádku.

3. Práce s TIMESTAMP a časovými zónami

Jednou z hlavních funkcí TIMESTAMP je jeho zpracování časových zón. Uložená data se vždy převádějí na UTC a při načítání se převádějí zpět na základě systémové časové zóny.

Kontrola nastavení časové zóny

V MySQL lze časové zóny nastavit na úrovni serveru nebo relace. Aktuální nastavení můžete zkontrolovat pomocí:

SHOW VARIABLES LIKE 'time_zone';

K změně časové zóny můžete použít:

SET time_zone = '+09:00';

TIMESTAMP vs. DATETIME v časových zónách

DATETIME ignoruje časové zóny a ukládá hodnoty přesně tak, jak byly zadány, zatímco TIMESTAMP převádí na UTC. To činí TIMESTAMP vhodnějším pro systémy fungující napříč více časovými zónami.

4. Problém s rokem 2038

Problém s rokem 2038 vzniká z omezení 32bitových systémů s TIMESTAMP. Protože počítá sekundy od 1. ledna 1970, přeteče po 19. lednu 2038 v 03:14:07 UTC.

Jak se vyhnout problému s rokem 2038

Aby se tomu předešlo, použijte 64bitový systém nebo přejděte na DATETIME, který podporuje roky 1000 až 9999. Upgrady systému na 64bit také tento problém zcela eliminují.

5. Praktické použití TIMESTAMP

MySQL TIMESTAMP slouží nejen k ukládání dat a časů, ale také k automatickému záznamu časů vytvoření a aktualizace. Některé použití zahrnují:

Automatické vložení aktuálního času

CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    order_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Automatická aktualizace časových razítek

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50),
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

Použití více sloupců TIMESTAMP

Ačkoli můžete mít v tabulce více sloupců TIMESTAMP, pouze jeden může mít CURRENT_TIMESTAMP jako výchozí hodnotu. Pro více automaticky spravovaných datových polí můžete potřebovat použít DATETIME nebo explicitně nastavit hodnoty.

CREATE TABLE posts (
    id INT AUTO_INCREMENT PRIMARY KEY,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

6. Na co si dát pozor při používání TIMESTAMP

Omezení NULL a výchozí hodnoty

Sloupce TIMESTAMP jsou výchozí NOT NULL. Aby bylo možné NULL hodnoty, specifikujte DEFAULT NULL.

CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    log_time TIMESTAMP DEFAULT NULL
);

Problém s 0000-00-00 00:00:00

Starší verze MySQL mohou umožnit 0000-00-00 00:00:00 jako neplatné časové razítko. Nicméně to může způsobit problémy s integritou a nedoporučuje se. Místo toho použijte NULL nebo platnou výchozí hodnotu.

Vliv systémové časové zóny

Protože TIMESTAMP vždy ukládá UTC, migrace databází mezi servery s různými časovými zónami může ovlivnit výsledky. Vždy zajistěte konzistentní správu časových zón.

7. Shrnutí a doporučení

TIMESTAMP je výkonný nástroj MySQL pro efektivní správu dat a časů. Jeho automatická konverze s časovými zónami a funkce automatické aktualizace ho činí vysoce pohodlným. Nicméně vývojáři musí pochopit jeho omezení, jako je problém s rokem 2038 a manipulace s NULL.

  • Používejte TIMESTAMP, když jsou vyžadovány automatické aktualizace.
  • Vyberte TIMESTAMP pro systémy citlivé na časové zóny.
  • Používejte DATETIME pro dlouhodobá data za rokem 2038 nebo když je potřebná absolutní konzistence.

8. Často kladené otázky (FAQ)

Kdy bych měl použít TIMESTAMP vs. DATETIME?

Používejte TIMESTAMP pro systémy potřebující úpravy časových zón a automatické záznamy časů vytvoření/aktualizace. Používejte DATETIME, když chcete konzistentní úložiště neovlivněné časovými zónami.

Je pravda, že TIMESTAMP nebude fungovat po roce 2038?

Ano, na 32bitových systémech TIMESTAMP přeteče po 19. lednu 2038. Aby se předešlo problémům, použijte DATETIME nebo migrovat na 64bitový systém.

Jak umožním NULL hodnoty ve sloupci TIMESTAMP?

Explicitně nastavte DEFAULT NULL při vytváření sloupce:

CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    log_time TIMESTAMP DEFAULT NULL
);

Ovlivní změna časové zóny existující data TIMESTAMP?

Uložená data zůstávají v UTC, ale načítání se upraví podle nového nastavení časové zóny, což změní způsob zobrazení časů. Udržujte systémové časové zóny konzistentní, aby se předešlo zmatku.

Mohu vložit specifický čas, pokud používám CURRENT_TIMESTAMP?

Ano. Zatímco CURRENT_TIMESTAMP vloží aktuální systémový čas, stále můžete ručně vložit specifické hodnoty:

INSERT INTO events (event_time) VALUES ('2023-10-01 12:30:00');