web-dev-qa-db-ja.com

MySQLがデフォルトのタイムスタンプとしてUTC時間を設定

デフォルト値が現在のUTC時間であるタイムスタンプ列を設定するにはどうすればよいですか?

MySQLはUTCタイムスタンプにUTC_TIMESTAMP()関数を使用します。

_mysql> SELECT UTC_TIMESTAMP();
+---------------------+
| UTC_TIMESTAMP()     |
+---------------------+
| 2012-07-01 11:36:35 |
+---------------------+
1 row in set (0.00 sec)
_

だから私は試しました:

_CREATE TABLE `blah` (
`creation_time` TIMESTAMP DEFAULT UTC_TIMESTAMP,
...
_

そして、UTC_TIMESTAMP()のような他のバリエーションですが、成功していません。

36
Adam Matan

@ypercubeのコメントCURRENT_TIMESTAMPはUTCとして保存されますが、現在のタイムゾーンとして取得されます。取得のために -default_time_zone オプションを使用してサーバーのタイムゾーン設定に影響を与えることができます。これにより、検索を常にUTCで行うことができます。

デフォルトでは、オプションは 'SYSTEM'で、これはシステムのタイムゾーンの設定方法です(UTCである場合とない場合があります)。

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+
1 row in set (0.00 sec)

mysql> SELECT CURRENT_TIMESTAMP();
+---------------------+
| CURRENT_TIMESTAMP() |
+---------------------+
| 2012-09-25 16:28:45 |
+---------------------+
1 row in set (0.00 sec)

これは動的に設定できます。

mysql> SET @@session.time_zone='+00:00';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | +00:00              |
+--------------------+---------------------+
1 row in set (0.00 sec)

または永久にmy.cnfに:

[mysqld]
**other variables**
default_time_zone='+00:00'

サーバーを再起動すると、変更が表示されます。

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| +00:00             | +00:00              |
+--------------------+---------------------+
1 row in set (0.00 sec)

mysql> SELECT CURRENT_TIMESTAMP();
+---------------------+
| CURRENT_TIMESTAMP() |
+---------------------+
| 2012-09-25 20:27:50 |
+---------------------+
1 row in set (0.01 sec)
50
Derek Downey

デフォルトとしてUTC_TIMESTAMPを指定して自動プロパティを指定することはできません。DEFAULTCURRENT_TIMESTAMPおよびON UPDATE CURRENT_TIMESTAMP句のみを使用する必要があります。

また、テーブルの場合でも、次のようにUTC_TIMESTAMP値を挿入できます。

CREATE TABLE `test` (
  `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

INSERTクエリは、UTC_TImeSTAMPを挿入するために次のようになります。

insert into `test` (`ts`) 
values
  (utc_timestamp()) ;
4
Mahesh Patil

私の解決策はトリガー付きです:

DELIMITER //
CREATE TRIGGER `update_to_utc` BEFORE INSERT ON `my_table` FOR EACH ROW BEGIN
set new.my_field=utc_timestamp();
END//
DELIMITER ;

次に、新しく挿入されるすべての行にUTCのタイムスタンプが付けられます。

4
Alqin

mariadbの場合、グローバルなmy.cnfソリューションのみが機能しました

mariadb 10.2の場合、この投稿での@Derek Downeyの永続的なソリューション。

[mysqld]
**other variables**
default_time_zone='+00:00'

mariadb 10.0(私は10.0.32でした)については、 を参照してください-use-utc

[mysqld_safe]
**other variables**
timezone = UTC

mariadb 10.2のmy.cnfには両方の定義が共存する可能性がありますが、mariadb 10.0はもうありません。

これがお役に立てば幸いです。

1
Alex Bodnaru