Skip to content
On this page

MySQL におけるタイムゾーンの理解

背景知識: 日付時刻、タイムスタンプ、タイムゾーン

ほとんどの場合、日付と時刻は現地のタイムゾーンでの現在時刻を指します。例えば、"2024-06-15 12:00:00"と見ると、それは2024年6月15日の12:00:00を現地のタイムゾーンで表しています。

しかし、アプリケーションが異なるタイムゾーンのユーザーにサービスを提供する場合、タイムゾーンの問題を考慮する必要があります。例えば、ニューヨークのユーザーが"2024-06-15 12:00:00"にレコードを作成した場合、そのレコードはニューヨークのタイムゾーンで12:00:00に作成されたことを意味します。北京の別のユーザーがそのレコードを表示する場合、時刻は北京のタイムゾーンに変換される必要があります。

要するに、日時は現地のタイムゾーンの時刻であり、世界中で利用可能にするために日時にタイムゾーン情報を追加する必要があります。

一方、タイムスタンプは1970年1月1日00:00:00 UTCから経過した秒数です。タイムスタンプはタイムゾーンに依存せず、どこにいても常に同じです。

MySQL における日付時刻データ型

MySQL にはいくつかの日付時刻データ型がありますが、最も重要なものは DATETIMETIMESTAMP です。

  • DATETIME: 日付と時刻で、フォーマットは YYYY-MM-DD HH:MM:SS です。日付と時刻を保存するため、タイムゾーンを考慮する必要があります。
  • TIMESTAMP: タイムスタンプで、タイムスタンプ番号を保存します。タイムゾーンに依存しないですが、タイムスタンプを書き込むか読み取る際にはタイムゾーンの変換が行われます。

MySQL におけるタイムゾーン

MySQL にはタイムゾーンを設定するためのシステム変数 time_zone があります。以下の方法でタイムゾーンを設定できます:

  1. 設定ファイル my.cnf でタイムゾーンを設定する:

    ini
    [mysqld]
    default-time-zone = '+00:00'
  2. MySQL クライアントでタイムゾーンを設定する:

    sql
    SET time_zone = '+00:00';
  3. 接続文字列でタイムゾーンを設定する:

    sql
    mysql -u root -p --default-time-zone='+00:00'

タイムゾーンを設定しない場合、MySQL はデフォルトでシステムのタイムゾーンを使用します。

アプリケーションでのタイムゾーンの設定

アプリケーションでMySQLを使用する場合、アプリケーションでタイムゾーンを設定する必要があります。例えば、Node.jsでは、次のようにタイムゾーンを設定できます:

javascript
const mysql = require('mysql2');
const conn = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'password',
    database: 'test',
    timezone: '+00:00'
});

多くの場合、アプリケーションでタイムゾーンを設定することが、タイムゾーンが正しいことを確認する唯一の方法です。MySQLサーバーに触れる機会がないかもしれませんが、常にアプリケーションコードを変更できます。

アプリケーションがタイムゾーンの設定をサポートしていないORMを使用している場合でも、他のオプションがあります:

  1. 他のクエリの前にタイムゾーン設定クエリを実行します。 (SET time_zone = '+00:00';)
  2. INTVARCHARなどの異なるデータ型を使用して日時を保存し、アプリケーションでタイムゾーンの変換を処理します。
  3. データベースに書き込む前に、MySQLサーバーで同じタイムゾーンに日時値を変換します。日時値を読み取る際にもアプリケーションでタイムゾーンの変換を行う必要があります。

結論

この記事では、日付時刻、タイムスタンプ、タイムゾーンの背景知識を学びました:日付時刻はタイムゾーン情報を持つべきであり、タイムスタンプはタイムゾーンに依存しません。次に、MySQLの日付時刻データ型である DATETIMETIMESTAMP を学びました。最後に、MySQLとアプリケーションでタイムゾーンを設定する方法を学びました。