ローカルタイムゾーンに設定されているMySQLデータベースがあります。データベースは異なるタイムゾーンを使用しますが、時刻はUTC時刻として挿入されます。MySQLサーバーでタイムゾーンをUTCに変更したいと思います。これを行う方法に関するドキュメントを見つけましたが、データベースにすでに保存されている値も変更されるかどうかわからないため、気が進まないです。
私の質問: MySQLサーバーのタイムゾーンを変更すると、すでに保存されている値も変更されますか?
ローカルタイムゾーンに設定されているMySQLデータベースがあります。データベースは異なるタイムゾーンを使用しますが、時刻はUTC時刻として挿入されます。MySQLサーバーでタイムゾーンをUTCに変更したいと思います。これを行う方法に関するドキュメントを見つけましたが、データベースにすでに保存されている値も変更されるかどうかわからないため、気が進まないです。
私の質問: MySQLサーバーのタイムゾーンを変更すると、すでに保存されている値も変更されますか?
原則として、そうすべきではありません。値のタイプに応じて、変更しない理由はさまざまです。主にDATETIMEとTIMESTAMPです。
DATETIME値は変換されないため、タイムゾーンに依存しません。
TIMESTAMP値は、現在のタイムゾーンからUTCに変換されて保存され、UTCから現在のタイムゾーンに戻されて取得されます(ここのマニュアルからの直接引用---かなり新しいバージョンのMySQLを使用していると思います)。 DATETIMEなどの他のタイプでは発生しません。)デフォルトでは、各接続の現在のタイムゾーンはサーバーの時刻です。タイムゾーンは接続ごとに設定できます。タイムゾーン設定が一定である限り、保存したのと同じ値を取得します。TIMESTAMP値を保存してからタイムゾーンを変更して値を取得すると、取得した値は保存した値とは異なります。これは、同じタイムゾーンが変換に使用されなかったために発生します。両方向。」(http://dev.mysql.com/doc/refman/5.5/en/datetime.htmlから)。
したがって、どちらの場合も、サーバーに実際に保存されているデータは変更されませんが(本来あるべき状態です)、クエリに表示される値は前後で異なる場合があります。
タイムスタンプの保存に列を使用しているTIMESTAMP
か、列を使用しているかによって異なります。DATETIME
TIMESTAMP
時間は、現地時間(正確には、接続のタイムゾーン設定から)からUTC時間に自動的に変換され、MySQLのテーブルに保存されます。それらは、取得時にUTCから現地時間に変換されます。
ただし、DATETIME
タイムスタンプは、アプリケーションがMySQLに提示したとおりに保存および取得されます。したがって、デフォルトのタイムゾーンをUTCに変更してからTIMESTAMP
値を取得すると、UTCで値が返されます。だから彼らは彼らが変わったように見えるでしょう。しかし、変更されたのは自動翻訳です。
MySQLのデフォルトのタイムゾーンを変更しても、テーブルの内容は変更されません。
MySQLに接続するときに次のコマンドを発行することで、これを試すことができます。
SET time_zone = '+0:00';
これにより、他に何も変更せずに接続のタイムゾーン設定が変更されます。
実稼働サーバーを再構成するときは、何をしているのかがわかっていることに注意してください。「MySQLデータベース...はローカルタイムゾーンに設定されている」と言います。何かを変更する前に、それがどのように設定されているかを正確に調査する必要があります。これが物事に影響を与える可能性のある設定だからです。
(1)MySQLサーバーソフトウェアを実行しているサーバーマシンの時計設定。
(2)そのマシンのタイムゾーン設定。
(3)実行中のMySQLサーバーのデフォルト(別名グローバル)タイムゾーン設定。
最近のほとんどのサーバーでは、時計は正しいUTC時刻に設定されており、タイムゾーン設定はユーザーが期待するローカルタイムゾーンに設定されています。また、MySQLサーバーのデフォルトのタイムゾーン設定は、同じローカルタイムゾーンに設定されています。それらが正しいことを確認する必要があります。
サーバーの時刻が標準時間から夏時間(米国では昨日の朝)に自動的かつ正確に切り替わる場合は、最初の2つがおそらく正しいでしょう。
このMySQLコマンドを発行する場合:SELECT @@global.time_zone' and get back either your local time zone name or
SYSTEM the third is right. Also issue
SELECT NOW()`を再確認します。適切な時刻を取得できれば、システムはおそらく問題ありません。最後に、次の2つのコマンドを発行します。
SET time_zone = '+0:00';
SELECT NOW();
システムから現在正しいUTC時刻を取得した場合、すべてが既知の良好な状態であり、タイムゾーンを切り替える準備ができています。
MySQL構成ファイルの変数を変更し、system_time_zone
MySQLサーバーを再起動して切り替えを行います。道順についてはこちらをご覧ください:
http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html