デフォルト値が現在の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()
のような他のバリエーションですが、成功していません。
@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)
デフォルトとして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()) ;
私の解決策はトリガー付きです:
DELIMITER //
CREATE TRIGGER `update_to_utc` BEFORE INSERT ON `my_table` FOR EACH ROW BEGIN
set new.my_field=utc_timestamp();
END//
DELIMITER ;
次に、新しく挿入されるすべての行にUTCのタイムスタンプが付けられます。
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はもうありません。
これがお役に立てば幸いです。