MySQL의 타임존을 UTC로 설정해야 합니까?
https://serverfault.com/questions/191331/should-servers-have-their-timezone-set-to-gmt-utc의 후속 질문
MySQL 타임존을 UTC로 설정할지 아니면 서버 또는 PHP와 동일한 타임존으로 설정할지(UTC가 아닌 경우)
장점과 단점은 무엇입니까?
현재 타임존에 대해 올바르게 설정되어 있는 시간대와 저장하는 날짜 컬럼의 시간대를 파악하고 서머타임에 관한 문제를 인식하고 있는 한 서버상의 타임존은 중요하지 않은 것 같습니다.
한편, 사용하는 서버의 타임 존을 제어할 수 있는 경우는, 모든 것을 내부적으로 UTC 로 설정할 수 있습니다.적어도 내부 시간을 보존하는 경우는, 타임 존이나 DST 에 대해 걱정할 필요가 없습니다.
여기 제가 수집한 몇 가지 메모가 있습니다.저 자신을 위한 치트시트의 형태로 타임존을 사용하는 방법과 그 사람이 서버에 어떤 타임존을 선택할지, 날짜와 시간을 저장하는 방법에 영향을 줄 수 있는 다른 메모는 다음과 같습니다.
MySQL 시간대 치트시트
주의:
표준 시간대를 변경해도 저장된 날짜 시간 또는 시간 스탬프는 변경되지 않지만 시간 스탬프 열에서 다른 날짜 시간이 선택됩니다.
경고!UTC에는 '2012-06-30 23:59:60'과 같은 윤초가 있으며, 지구의 자전 속도가 느려지기 때문에 6개월 전에 예고하여 임의로 추가할 수 있습니다.
GMT는 초수를 혼동하기 때문에 UTC가 발명되었습니다.
경고! 일광 절약 시간으로 인해 다른 지역 표준 시간대에서 동일한 날짜/시간 값이 생성될 수 있습니다.
타임스탬프 컬럼에서는 1970-01-01 00:00:01 ~2038-01-19 03:14:07 UTC까지만 지원됩니다.
내부적으로 MySQL 타임스탬프 열은 UTC로 저장되지만 날짜를 선택하면 MySQL이 자동으로 현재 세션 시간대로 변환합니다.
타임스탬프에 날짜를 저장할 때 MySQL은 해당 날짜가 현재 세션 시간대에 있다고 가정하고 UTC로 변환하여 저장합니다.
MySQL은 "2013-00 04:00:00"처럼 보이는 부분 날짜를 날짜/시간 열에 저장할 수 있습니다.
MySQL은 datetime 열을 NULL로 설정하면 "0000-00 00:00:00"을 저장합니다. 단, 생성할 때 null을 허용하도록 열을 특별히 설정하지 않으면 그렇지 않습니다.
UTC 형식의 타임스탬프 열을 선택하려면
현재 MySQL 세션이 있는 시간대에 관계없이 다음 작업을 수행합니다.
SELECT
CONVERT_TZ(`timestamp_field`, @@session.time_zone, '+00:00') AS `utc_datetime`
FROM `table_name`
서버 또는 글로벌 또는 현재 세션타임존을 UTC로 설정하고 다음과 같이 타임스탬프를 선택할 수도 있습니다.
SELECT `timestamp_field` FROM `table_name`
현재 날짜(UTC)를 선택하려면:
SELECT UTC_TIMESTAMP();
SELECT UTC_TIMESTAMP;
SELECT CONVERT_TZ(NOW(), @@session.time_zone, '+00:00');
예: " " "2015-03-24 17:02:41
세션 표준 시간대에서 현재 날짜/시간을 선택하려면
SELECT NOW();
SELECT CURRENT_TIMESTAMP;
SELECT CURRENT_TIMESTAMP();
서버 부팅 시 설정된 표준 시간대를 선택하려면
SELECT @@system_time_zone;
모스크바 시간에 대해 "MSK" 또는 "+04:00"를 반환합니다. 예를 들어 숫자 오프셋으로 설정하면 일광 절약 시간을 조정하지 않는 MySQL 버그가 있거나 있었습니다.
현재 표준 시간대를 가져오려면
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);
표준 시간대가 +2:00이면 02:00:00가 반환됩니다.
현재의 UNIX 타임스탬프(초단위)를 취득하려면 , 다음의 순서에 따릅니다.
SELECT UNIX_TIMESTAMP(NOW());
SELECT UNIX_TIMESTAMP();
타임스탬프 열을 UNIX 타임스탬프로 가져오려면
SELECT UNIX_TIMESTAMP(`timestamp`) FROM `table_name`
UTC datetime 열을 UNIX 타임스탬프로 가져오려면 다음과 같이 하십시오.
SELECT UNIX_TIMESTAMP(CONVERT_TZ(`utc_datetime`, '+00:00', @@session.time_zone)) FROM `table_name`
양의 UNIX 타임스탬프 정수에서 현재 시간대 날짜/시간을 가져옵니다.
SELECT FROM_UNIXTIME(`unix_timestamp_int`) FROM `table_name`
UNIX 타임스탬프에서 UTC 날짜/시간을 가져옵니다.
SELECT CONVERT_TZ(FROM_UNIXTIME(`unix_timestamp_int`), @@session.time_zone, '+00:00')
FROM `table_name`
음의 UNIX 타임스탬프 정수에서 현재 시간대 날짜/시간을 가져옵니다.
SELECT DATE_ADD('1970-01-01 00:00:00',INTERVAL -957632400 SECOND)
MySQL에서 타임존을 설정할 수 있는 장소는 3개입니다.
주의: 타임존은 다음 두 가지 형식으로 설정할 수 있습니다.
- UTC로부터의 오프셋: '+00:00', '+10:00' 또는 '-6:00'
- 지정된 시간대: '유럽/헬싱키', '미국/동부' 또는 'MET'
이름 있는 타임존은 mysql 데이터베이스 내의 타임존 정보 테이블이 작성되어 입력된 경우에만 사용할 수 있습니다.
파일 "my.cnf"에 포함됨
default_time_zone='+00:00'
또는
timezone='UTC'
@@global.time_zone 변수
어떤 값으로 설정되어 있는지 확인합니다.
SELECT @@global.time_zone;
값을 설정하려면 다음 중 하나를 사용합니다.
SET GLOBAL time_zone = '+8:00';
SET GLOBAL time_zone = 'Europe/Helsinki';
SET @@global.time_zone='+00:00';
@@syslog.time_zone 변수
SELECT @@session.time_zone;
설정하려면 다음 중 하나를 사용합니다.
SET time_zone = 'Europe/Helsinki';
SET time_zone = "+00:00";
SET @@session.time_zone = "+00:00";
둘 다 "@@global.time_zone variable" 및 "@@session.time_zone variable"은 "SYSTEM"을 반환할 수 있습니다.이는 "my.cnf"에 설정된 시간대를 사용함을 의미합니다.
타임존 이름이 기능하려면(디폴트 타임존에서도), 타임존 정보 테이블을 설정할 필요가 있습니다. http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html
주의: NULL이 반환되므로 이 작업을 수행할 수 없습니다.
SELECT
CONVERT_TZ(`timestamp_field`, TIMEDIFF(NOW(), UTC_TIMESTAMP), '+00:00') AS `utc_datetime`
FROM `table_name`
mysql 시간대 테이블 설정
★★★의 CONVERT_TZ, 「 be 」, 「timezone tables to incumpled」, 「timezone tables to incumpled」가 합니다.
SELECT * FROM mysql.`time_zone` ;
SELECT * FROM mysql.`time_zone_leap_second` ;
SELECT * FROM mysql.`time_zone_name` ;
SELECT * FROM mysql.`time_zone_transition` ;
SELECT * FROM mysql.`time_zone_transition_type` ;
이 명령어가 비어 있는 경우 다음 명령을 실행하여 값을 채웁니다.
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
이 명령어가 "data too long for column '약어' at row 1" 오류를 표시하는 경우 시간대 약어 끝에 NULL 문자가 추가되어 있을 수 있습니다.
이것을 실행하는 것이 해결책이다
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
(if the above gives error "data too long for column 'abbreviation' at row 1")
mysql_tzinfo_to_sql /usr/share/zoneinfo > /tmp/zut.sql
echo "SET SESSION SQL_MODE = '';" > /tmp/mysql_tzinfo_to.sql
cat /tmp/zut.sql >> /tmp/mysql_tzinfo_to.sql
mysql --defaults-file=/etc/mysql/my.cnf --user=verifiedscratch -p mysql < /tmp/mysql_tzinfo_to.sql
해 주세요(「dst」의 「dst」의 「dst」의 「dst」의 「dst」의 「dst」의 「dst」의 「dst」의 「dst」의 「dst」의 「dst」의 「zdump -v Europe/Moscow | grep 2011 https://chrisjean.com/updating-daylight-saving-time-on-linux/)
모든 타임존의 DST(Daylight Saving Time) 이행 이력을 참조해 주세요.
SELECT
tzn.Name AS tz_name,
tztt.Abbreviation AS tz_abbr,
tztt.Is_DST AS is_dst,
tztt.`Offset` AS `offset`,
DATE_ADD('1970-01-01 00:00:00',INTERVAL tzt.Transition_time SECOND) AS transition_date
FROM mysql.`time_zone_transition` tzt
INNER JOIN mysql.`time_zone_transition_type` tztt USING(Time_zone_id, Transition_type_id)
INNER JOIN mysql.`time_zone_name` tzn USING(Time_zone_id)
-- WHERE tzn.Name LIKE 'Europe/Moscow' -- Moscow has weird DST changes
ORDER BY tzt.Transition_time ASC
CONVERT_TZ또한 위의 표의 규칙과 사용하는 날짜에 따라 필요한 DST 변경도 적용됩니다.
문서에 따르면 time_zone에 설정한 값은 변경되지 않습니다.예를 들어 "+01:00"로 설정하면 time_zone은 DST에 따르지 않는 UTC로부터의 오프셋으로 설정되므로 1년 내내 동일하게 유지됩니다.
여름 시간 동안 지정된 시간대만 시간을 변경합니다.
CET CEST이고 +01:00는 시간입니다.UTC시간 + 1시간으로 둘 다 DST와 함께 변경되지 않습니다.
system있는 (mysql을 ).
DST 사용에 대한 자세한 내용은 여기를 참조하십시오.
전설의 Jon Sket에 의해 UTC를 사용하지 않는 경우:https://codeblog.jonskeet.uk/2019/03/27/storing-utc-is-not-a-silver-bullet/ (예를 들어 순간의 시간이 아닌 미래의 일정된 이벤트)
관련 질문:
- MySQL의 타임존을 설정하려면 어떻게 해야 하나요?
- MySql - UTC 형식의 SELECT 타임스탬프 열
- UTC 시각에서 MySQL의 Unix 타임스탬프를 얻는 방법
- 서버 MySQL 타임스탬프를 UTC로 변환하는 중
- https://dba.stackexchange.com/questions/20217/mysql-set-utc-time-as-default-timestamp
- MySQL의 현재 시간대를 얻으려면 어떻게 해야 합니까?
- MySQL datetime 필드 및 여름 시간 - "추가" 시간은 어떻게 참조합니까?
- FROM_UNIXTIME에서 음수 값을 변환하는 중
출처:
- https://bugs.mysql.com/bug.php?id=68861
- http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html
- http://dev.mysql.com/doc/refman/5.1/en/datetime.html
- http://en.wikipedia.org/wiki/Coordinated_Universal_Time
- http://shafiqissani.wordpress.com/2010/09/30/how-to-get-the-current-epoch-time-unix-timestamp/
- https://web.ivy.net/~carton/rant/MySQL-timezones.txt
PHP 및 MySQL에는 자체 기본 시간대 구성이 있습니다.데이터베이스와 웹 응용 프로그램 간에 시간을 동기화해야 합니다. 그렇지 않으면 몇 가지 문제가 발생할 수 있습니다.
이 튜토리얼을 읽습니다.PHP와 MySQL 시간대를 동기화하는 방법
다음으로 동작 예를 제시하겠습니다.
jdbc:mysql://localhost:3306/database?useUnicode=yes&characterEncoding=UTF-8&serverTimezone=Europe/Moscow
찬반 양론이 거의 일치한다.당신이 이걸 원하느냐 원하지 않느냐에 달렸어요.
MySQL 타임존이 시스템 시각(예를 들어 PHP)과 다를 경우 시간과 인쇄 시간을 사용자와 비교하는 것은 약간의 조작을 수반합니다.
서버의 시간대에 구애받지 않는 애플리케이션을 만드는 것은 어떻습니까?
다음의 몇개의 시나리오가 원인으로 발생합니다.
- 웹/데이터베이스 서버의 시간대 설정을 제어할 수 없는 경우가 있습니다.
- 설정이 잘못되어 잘못 설정될 수 있습니다.
- 다른 답변에서 설명한 것과 같이 설정이 너무 많아 주의해야 할 사항이 너무 많아 놓칠 수 있습니다.
- 서버의 갱신, 소프트웨어 리셋, 또는 다른 관리자가 모르고 서버의 타임존을 디폴트로 리셋 하면 어플리케이션이 파손될 수 있습니다.
위의 모든 시나리오에 따라 응용 프로그램의 시간 계산이 깨집니다.따라서 어플리케이션이 서버의 타임존에 관계없이 동작하도록 하는 것이 더 좋은 접근법인 것 같습니다.
데이터베이스에 저장하기 전에 항상 UTC에 날짜를 작성하고 UTC에 저장된 값에서 항상 다시 작성합니다.이렇게 하면 시간 계산이 항상 UTC에 있기 때문에 정확하지 않게 됩니다.이것은 설명에 의해 실현될 수 있습니다.DateTimeZonePHP를 생성할 때 매개 변수DateTime물건.
한편, 서버로부터 수신한 모든 날짜/시간을 클라이언트의 타임 존으로 변환하도록 클라이언트측의 기능을 설정할 수 있습니다.라이브러리는 moment.js를 좋아하기 때문에 매우 간단합니다.
예를 들어 데이터베이스에 날짜를 저장하는 경우NOW()다음과 같이 타임스탬프 문자열을 UTC에 작성합니다.
// Storing dates
$date = new DateTime('now', new DateTimeZone('UTC'));
$sql = 'insert into table_name (date_column) values ("' . $date . '")';
// Retreiving dates
$sql = 'select date_column from table_name where condition';
$dateInUTC = new DateTime($date_string_from_db, new DateTimeZone('UTC'));
생성된 모든 날짜에 대해 PHP에서 기본 시간대를 설정할 수 있으므로 날짜를 만들고 싶을 때마다 DateTimeZone 클래스를 초기화할 필요가 없습니다.
언급URL : https://stackoverflow.com/questions/19023978/should-mysql-have-its-timezone-set-to-utc
'source' 카테고리의 다른 글
| System.getProperty("java.io.tmpdir")는 언제 "c:\tempdir"를 반환합니까? (0) | 2022.12.31 |
|---|---|
| @RunWith(Mockito)JUnitRunner.class)와 MockitoAnnotations.initMocks(이것) (0) | 2022.12.31 |
| Mysql 오류 1452 - 하위 행을 추가하거나 업데이트할 수 없습니다. 외부 키 제약 조건이 실패합니다. (0) | 2022.12.31 |
| bootstrap-vue를 사용한 재스트 실행 (0) | 2022.12.31 |
| MySQL 데이터베이스를 SQLite 데이터베이스로 내보내기 (0) | 2022.12.31 |