MySQL UTC 시간을 기본 타임 스탬프로 설정


35

기본값이 현재 UTC 시간 인 타임 스탬프 열을 어떻게 설정합니까?

MySQL은 UTC_TIMESTAMP()UTC 타임 스탬프에 함수를 사용 합니다.

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()성공했지만 성공하지 못했습니다.


시도 했습니까 CURRENT_TIMESTAMP?
ypercubeᵀᴹ

1
작동하지만 UTC 대신 로컬 시간대 값을 저장하지 않습니다.
Adam Matan

정확히 무엇을하고 싶습니까? UTC 타임 스탬프를 표 열에 저장 하시겠습니까? 또는 다른 것?
ypercubeᵀᴹ

8
에서 날짜, DATETIME, 및 TIMESTAMP 유형 :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로 스토리지는 DATE 및 DATETIME이 아닌 TIMESTAMP 데이터 유형에만 적용됩니다 (기본값은으로 설정할 수 있음 CURRENT_TIMESTAMP). 동일한 문서 페이지에서 : (This does not occur for other types such as DATETIME.).
AronVanAmmers

답변:


49

CURRENT_TIMESTAMPUTC로 저장되었지만 현재 시간대로 검색된 @ypercube의 설명과 함께 검색하려면 --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)

2
매우 유용한 게시물 !!
om39a

default_time_zone특정 테이블이나 데이터베이스 를 지정할 수 있습니까? 감사.
WM

2
특정 쿼리에 대해 default_time_zone을 지정할 수 있습니까?
mcmillab

@mcmillab 쿼리를 실행하기 전에 세션 시간대를 설정 한 다음 추가 쿼리를 실행하기 전에 글로벌 시간대로 재설정하거나 다시 연결할 수 있습니다.
데릭 다우니

mcmillab에 따라-또는 기본 UTC 값을 표시하는 연산자로 열을 쿼리하십시오 (1 대 1 변환이 아니기 때문에)?
Marc L.

4

UTC_TIMESTAMP자동 특성을 지정하기 위해 기본값으로 지정할 수 없습니다 . DEFAULT CURRENT_TIMESTAMPON 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()) ;

감사합니다 "자동 속성을 지정하기 위해 기본적으로 UTC_TIMESTAMP를 지정할 수 없습니다"
Barbaros Alp

4

내 솔루션은 트리거입니다.

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

그런 다음 새로 삽입 된 모든 행의 타임 스탬프는 UTC로 표시됩니다.


1

mariadb의 경우 글로벌 my.cnf 솔루션 만 작동했습니다.

이 글에서 @Derek Downey의 영구적 인 솔루션 인 mariadb 10.2를 위해.

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

mariadb 10.0 (i는 10.0.32)의 경우 https://stackoverflow.com/questions/947299/how-do-i-make-mysqls-now-and-curdate-functions-use-utc를 참조 하십시오.

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

두 정의 모두 mariadb 10.2의 my.cnf에 공존 할 수 있지만 더 이상 mariadb 10.0이 없습니다.

이것이 도움이되기를 바랍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.