php timezone 과 MySQL session timezone
MySQL의 3가지 timezone
MySQL 에서 timezone 은 3가지가 있다.
- my.cnf 의 default-time-zone='+00:00'
- global timezone : SELECT @@global.time_zone;
- session timezone : SELECT @@session.time_zone; / SET time_zone='+09:00'
timezone 이 SYSTEM 인 경우 session timezone 확인법
만약 MySql DB의 timezone 이 아래처럼 SYSTEM 으로 보이는 경우 session 의 timezone 을 확인하려면 SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)를 이용하면 된다.[ref. 3]mysql> SELECT @@global.time_zone, @@session.time_zone; +--------------------+---------------------+ | @@global.time_zone | @@session.time_zone | +--------------------+---------------------+ | SYSTEM | SYSTEM | +--------------------+---------------------+
현재 session 의 timezone 을 확인하는 법
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)
DB의 session timezone 으로 인한 문제
Lumen/Laravel 에서 Eloquent를 사용하는데, MySQL timestamp column 에 UTC time 을 insert 했는데, 현재의 timezone 값이 그대로 들어갔다. 예를 들어 현재 서울시간으로 09시인 경우에 column 에는 UTC 09시가 입력되었다.- 현재 시간: 3월 23일 09:00+09:00
- DB column의 입력된 시간 : 3월 23일 09:00+00:00
결론부터 이야기하면, 이것은 문제가 아니라, session timezone 에 대한 이해가 부족해서 였다. 내가 열어놓고 있는 client 의 session 의 time_zone 이 '+09:00' 로 되어 있어서 그렇게 보이는 것일 뿐, 이 time_zone 을 +00:00 으로 변경한 후에는 정상적으로 보였다.
ref.4에서 명확한 답을 알려준다.
laravel/lumen 에서 db session 의 timezone 설정
laravel/lumen 에서는 database.php (db config) 에서 timezone 을 설정해 주면, php 가 db 와 session 을 맺을 때 set time_zone = '...' 을 하게 된다.아래처럼 env(DB_TIMEZONE, ...) 로 되어 있어서 .env 에서 설정을 해줘도 된다.
- <cocktail_lumen>\src\config\database.php
'mysql' => [ ... 'timezone' => env('DB_TIMEZONE', '+00:00'), ...
mysql client 의 db session
주의할 점은 phpMyAdmin 같은 mysql client 를 사용할 때는 php 가 사용하는 session 과 다르기 때문에 session timezone 이 다르게 설정될 수 밖에 없다. 그러니 주의하자.이런 실수를 피하기 위해서는 자신의 db client 의 session timezone 을 php 와 동일하게 맞춰놓는 것이 좋다.
SELECT @@session.time_zone; -- SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)
set time_zone = '+00:00' -- UTC인 경우;
또는 반대로 Aisa/Seoul로 값을 입력하고 싶은 경우에는 set time_zone = '+09:00'; 를 해놓고, 입력을 해놓은 후에 다시 set time_zone = '+00:00' 로 변경하면 편리하게 입력을 할 수 도 있다.
References
- timezone - How do I set the time zone of MySQL? - Stack Overflow
- time - Should MySQL have its timezone set to UTC? - Stack Overflow
- timezone - How do I get the current time zone of MySQL? - Stack Overflow
- Laravel saving timestamps as UTC but MySQL server is also adding an extra offset.
- How To Synchronize Your Timezones in PHP and MySQL
댓글 없음:
댓글 쓰기