2011-12-08 4 views
7

私はmysqlのタイムゾーンに関する奇妙な問題があります。私のウェブサイトの設定ファイルでmysql timezoneを正しく設定するには

私はタイムゾーンを設定し、このラインを持っている:

mysql_query("SET SESSION time_zone = '$offset';"); // Offset is properly calculated, no worries about that 

面白い部分があること私はこのような権利この後、別の行を追加した場合:

$q = mysql_query("SELECT NOW() as now"); 
$row = mysql_fetch_array($row); 
echo $row["now"]; 

実行した後そのコードは、時間が正しく表示されます。

しかし、いくつかの他のクエリでは、CURRENT_TIMESTAMPにデフォルト設定されているdateという名前の列を持つテーブルに行を挿入します。

行は次のように挿入されている:

INSERT INTO `sessions` (`user_id`) VALUES `1` 

しかし、DBに挿入された値がまだサーバーのタイムゾーンに戻す点(セッションテーブルがdateカラムCURRENT_TIMESTAMPデフォルトを有しています)。 ((

この介して動作するためにどのように任意のアイデア?

+0

DBに挿入された値をサーバーのタイムゾーンに戻すと、どうやって確認できますか?また、 'SET SESSION time_zone'トリックを行ったところで接続しましたか? – Romain

+0

'INSERT'を実行する前に接続を閉じていますか? – ManseUK

+0

phpMyAdminでチェックしていますが、スクリプトの実行が終了するまでに接続が閉じられていません –

答えて

19

あなたは、MySQLは、複数のTIを維持していることを理解する必要があります私のゾーン設定:

  • システムのタイムゾーン(基本的にはOSに設定されたタイムゾーン)
  • サーバーのタイムゾーン(MySQLが使用するタイムゾーン)
  • クライアントのタイムゾーン(接続ごとに使用されるセッションのタイムゾーン)

詳細については、http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.htmlを参照してください。

日付/時刻値は、2つの異なる方法で格納されています

  • すべてのUNIXタイムスタンプベースの値は常にUTCに格納されています。それらは、内部で保存され、読み取られたときに、クライアントタイムゾーンとの間で内部的に変換されます。 NOW()およびCURTIME()関数は、タイムスタンプベースのものと同じです。
  • DATE、TIMEおよびDATETIME列(値を年 - 月 - 日時 - 分 - 秒形式で格納)は、タイムゾーン設定の影響を受けず、変換されません。

UNIXのタイムスタンプベースの列から読み取った値は、必ずしもDBに実際に格納されている値ではありません。これらは、サーバーのタイムゾーンとクライアントのタイムゾーンを使用して変換されます。あなたがメカニックの詳細を理解していないと、結果が混乱することがあります。最初のテストのために

は、グローバルタイムゾーンは常に同じになります

SELECT @@global.time_zone, @@session.time_zone; 

を実行して、クライアントプログラムのそれぞれの現在の設定を探してみてください。ただし、セッション・タイムゾーンはクライアント・アプリケーションごとに異なる場合があり、読み取りおよび書き込み操作の結果が変更されます。

+2

ありがとう、本当に喜んで!私はphpMyAdminがサーバーのタイムゾーンに変換された時刻を表示していることに気がついたが、セッションタイムゾーンを設定した後にスクリプトからDBを読み込んだら、それはcorreclyと表示されたのでちょうどphpMyAdminで混乱していた。 –

+0

@DanyKhalifeありがとう、私は狂ったと思った。 – Mark

+0

@Jpsy Greate Answer..i queryどのようにあなたはmysql confiqファイルのクライアントタイムゾーンを設定しますか? – goodyzain

関連する問題