MySQL UTC zamanını varsayılan zaman damgası olarak ayarla


35

Varsayılan değeri geçerli UTC saati olan bir zaman damgası sütununu nasıl ayarlarım?

MySQL UTC_TIMESTAMP()UTC zaman damgası için işlev kullanır :

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

Bu yüzden denedim:

CREATE TABLE `blah` (
`creation_time` TIMESTAMP DEFAULT UTC_TIMESTAMP,
...

Ve diğer varyasyonlar, UTC_TIMESTAMP()ama başarılı değil.


Denedin CURRENT_TIMESTAMPmi
ypercubeᵀᴹ

1
Çalışır, ancak UTC yerine yerel bir saat dilimi değerini kaydetmez.
Adam Matan

Tam olarak ne yapmak istiyorsun? UTC zaman damgasını tablo sütununda sakla? Veya başka bir şey?
ypercubeᵀᴹ

8
Gönderen TARİH DATETIME ve TIMESTAMP Türleri :MySQL converts TIMESTAMP values from the current time zone to UTC for storage, and back from UTC to the current time zone for retrieval.
ypercubeᵀᴹ

3
UTC olarak depolamanın sadece TIMESTAMP veri türü için geçerli olduğunu unutmayın (DATE ve DATETIME için geçerli değildir) (varsayılan ayarlarına göre ayarlayabilirsiniz CURRENT_TIMESTAMP). Aynı belgeler sayfasından: (This does not occur for other types such as DATETIME.).
AronVanAmmers

Yanıtlar:


49

@ Ypercube'ün CURRENT_TIMESTAMPUTC olarak depolanan, ancak geçerli saat dilimi olarak alınan yorumuyla birlikte gitmek için, sunucunuzun saat dilimi ayarını --default_time_zone seçeneği ile değiştirebilirsiniz. Bu, alımınızın her zaman UTC'de olmasını sağlar.

Varsayılan olarak, seçenek 'SİSTEM' şeklindedir ve sistem saat diliminizin nasıl ayarlandığı (UTC olabilir veya olmayabilir!):

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)

Bunu dinamik olarak ayarlayabilirsiniz:

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)

Veya my.cnf'inizde kalıcı olarak:

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

Sunucunuzu yeniden başlattığınızda, değişikliği göreceksiniz:

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)

2
Çok yardımcı yazı!
om39a

default_time_zoneBelirli bir tablo veya veritabanı için belirtmek mümkün mü ? Teşekkürler.
WM,

2
Belirli bir sorgu için default_time_zone belirtilebilir mi?
mcmillab

@mcmillab sorguyu çalıştırmadan önce oturumun saat dilimini ayarlayabilir, daha sonra başka sorguları çalıştırmadan (veya yeniden bağlanmadan) genel saat dilimine sıfırlayabilirsiniz.
Derek Downey

Mcmillab'dan sonra - veya sütunu, temel UTC değerini gösteren bir işleçle sorgulamak mı (dönüşüm 1-1 olmadığından)?
Marc L.

4

UTC_TIMESTAMPOtomatik özellikleri belirlemek için varsayılan olarak belirleyemezsiniz, sadece VARSAYILAN CURRENT_TIMESTAMPve ON UPDATE CURRENT_TIMESTAMPyan tümceleri kullanmalısınız.

Ayrıca UTC_TIMESTAMPbir tablo için olsa bunun gibi değerleri INSERT yapabilirsiniz :

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

INSERT sorgusu UTC_TImeSTAMP eklemek için şöyle olurdu:

insert into `test` (`ts`) 
values
  (utc_timestamp()) ;

"Otomatik özellikleri belirtmek için varsayılan olarak UTC_TIMESTAMP belirtemezsiniz" için teşekkür ederiz
Barbaros Alp

4

Benim çözümüm bir tetikleyici ile:

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

Sonra eklenen her yeni satır UTC'de zaman damgasına sahip olacaktır.


1

mariadb için sadece global my.cnf çözümleri işe yaradı

mariadb 10.2 için bu yazıdaki @Derek Downey'in daimi çözümü.

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

mariadb 10.0 için (10.0.32 vardı), https://stackoverflow.com/questions/947299/how-do-i-make-mysqls-now-and-curdate-functions-use-utc adresini ziyaret edin.

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

her iki tanım da mariadb 10.2 'nin cnf kodunda bir arada bulunabilir, fakat artık mariadb 10.0 yok.

umarım bu size yardımcı olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.