[컴] php timezone 과 MySQL session timezone

php 의 timezone 이 DB의 timezone 에 적용이 안되는 문제 /



php timezone 과 MySQL session timezone


MySQL의 3가지 timezone

MySQL 에서 timezone 은 3가지가 있다.
  1. my.cnf 의 default-time-zone='+00:00'
  2. global timezone : SELECT @@global.time_zone;
  3. 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'),
  ...


ref. 5에서는 lumen/laravel 이 아닌상황에서 사용법을 알려준다. 참고하자.

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

  1. timezone - How do I set the time zone of MySQL? - Stack Overflow
  2. time - Should MySQL have its timezone set to UTC? - Stack Overflow
  3. timezone - How do I get the current time zone of MySQL? - Stack Overflow
  4. Laravel saving timestamps as UTC but MySQL server is also adding an extra offset.
  5. How To Synchronize Your Timezones in PHP and MySQL




댓글 없음:

댓글 쓰기