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 にはいくつかの日付時刻データ型がありますが、最も重要なものは DATETIME
と TIMESTAMP
です。
DATETIME
: 日付と時刻で、フォーマットはYYYY-MM-DD HH:MM:SS
です。日付と時刻を保存するため、タイムゾーンを考慮する必要があります。TIMESTAMP
: タイムスタンプで、タイムスタンプ番号を保存します。タイムゾーンに依存しないですが、タイムスタンプを書き込むか読み取る際にはタイムゾーンの変換が行われます。
MySQL におけるタイムゾーン
MySQL にはタイムゾーンを設定するためのシステム変数 time_zone
があります。以下の方法でタイムゾーンを設定できます:
設定ファイル
my.cnf
でタイムゾーンを設定する:ini[mysqld] default-time-zone = '+00:00'
MySQL クライアントでタイムゾーンを設定する:
sqlSET time_zone = '+00:00';
接続文字列でタイムゾーンを設定する:
sqlmysql -u root -p --default-time-zone='+00:00'
タイムゾーンを設定しない場合、MySQL はデフォルトでシステムのタイムゾーンを使用します。
アプリケーションでのタイムゾーンの設定
アプリケーションでMySQLを使用する場合、アプリケーションでタイムゾーンを設定する必要があります。例えば、Node.jsでは、次のようにタイムゾーンを設定できます:
const mysql = require('mysql2');
const conn = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'password',
database: 'test',
timezone: '+00:00'
});
多くの場合、アプリケーションでタイムゾーンを設定することが、タイムゾーンが正しいことを確認する唯一の方法です。MySQLサーバーに触れる機会がないかもしれませんが、常にアプリケーションコードを変更できます。
アプリケーションがタイムゾーンの設定をサポートしていないORMを使用している場合でも、他のオプションがあります:
- 他のクエリの前にタイムゾーン設定クエリを実行します。 (
SET time_zone = '+00:00';
) INT
やVARCHAR
などの異なるデータ型を使用して日時を保存し、アプリケーションでタイムゾーンの変換を処理します。- データベースに書き込む前に、MySQLサーバーで同じタイムゾーンに日時値を変換します。日時値を読み取る際にもアプリケーションでタイムゾーンの変換を行う必要があります。
結論
この記事では、日付時刻、タイムスタンプ、タイムゾーンの背景知識を学びました:日付時刻はタイムゾーン情報を持つべきであり、タイムスタンプはタイムゾーンに依存しません。次に、MySQLの日付時刻データ型である DATETIME
と TIMESTAMP
を学びました。最後に、MySQLとアプリケーションでタイムゾーンを設定する方法を学びました。