How MySQL TIMESTAMP stroed in the database

MySQL TIMESTAMP 열(column)의 형식은 'YYYY-MM-DD HH:MM:SS'이며 19개 문자로 고정됨.

MySQL TIMESTAMP는 '1970-01-01 00:00:01'을 시작으로 초(second)를 4 byte의 숫자로 저장함.

4 byte의 수치에 대응되는 범위에 따라 TIMESTAMP는 '1970-01-01 00:00:01' ~ '2038-01-19 03:14:07'의 범위를 갖음.

 

MySQL TIMESTAMP 값은 connection's time zone에 종속적.

MySQL TIMESTAMP에 값을 입력할 때, 이 값은 connection's time zone에서 Universal Coordinated Time(UTC, 국제 표준시)로 변환됨.

값을 선택하면, server는 UTC에서 connection's time zone으로 변환하므로 입력했던 동일한 값을 얻음.

 

create table test_timestamp(t1 timestamp);

 

set time_zone='+00:00';

 

insert into test_timestamp values('2008-01-01 00:00:01');

 

select t1

from test_timestamp;

 


 

 

 

+---------------------+

| t1 |
+---------------------+
| 2008-01-01 00:00:01 |
+---------------------+
1 row in set (0.00 sec)

 



 

set time_zone='+03:00';

select t1
from test_timestamp;

 

 

 

+---------------------+

| t1 |
+---------------------+
| 2008-01-01 03:00:01 |
+---------------------+
1 row in set (0.00 sec)

 





INSERT and UPDATE TIMESTAMP column
만약 MySQL TIMESTAMP 값을 생략하거나 NULL을 입력한다면, 현재 TIMESTAMP는 자동적으로 입력됨. 이것은 MySQL TIMESTAMP의 자동 초기화 특성임.

다른 열의 값을 변경했을 때, MySQL TIMESTAMP는 현재 TIMESTAMP로 자동 갱신됨. TIMESTAMP가 갱신되기 위해선 현재의 값을 다른 값으로 변경하는 경우에만 갱신됨.

 

 

CREATE TABLE tbl_name(

created_on TIMESTAMP DEFAULT 0

changed_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP

);

 

--

필드 지정시 날짜와 관련이 되면 이전부터 많이들 TIMESTAMP를 사용하였는데요
일단, 둘의 차이점을 알아봅시다
TIMESTAMP만의 특성입니다.

서버의 시간에 의존(UTC에 따라 변형된다는 의미로 해석하면 될 것 같네요)
범위가 '1970-01-01 00:00:01' UTC to '2038-01-09 03:14:07' UTC로 제한됨
on update CURRENT_TIMESTAMP 옵션을 사용할 수 있다.


이러한 차이는 쉽게 말하면
DATETIME는 순수하게 상수로 된 날짜로 인식하지만,
TIMESTAMP는 서버시간에 의한 의존하는 날짜 개념이죠.(서버 time zone 변경시, 바뀝니다)

해외서버를 사용한다면, 문제를 일으킬 수 있는 부분입니다.
국내에서만 사용 할 경우는 별다른 문제가 일어나지 않겠지요.(아마도??)

on update CURRENT_TIMESTAMP 이건, UPDATE시 시간도 업데이트 해주는건데, TIMESTAMP타잎에서만 사용할수 있습니다. 수정된 시간 저장시 매우 유용하게 사용할 수 있는 거죠.

반면에,
클라이언트의 시간을 서버에서 받아서 저장을 하다면, TIMESTAMP보다는 DATETIME을 사용을 권장하게 되겠네요.

등록시간은 DATETIME으로 잡고, 수정시간은 TIMESTAMP on update CURRENT_TIMESTAMP로 사용하면, 편할 거 같다는 생각이 듭니다. 물론 UTC나 timezone에 영향은 고려해야겠지요.

DATETIME
- 범위 : '1000-01-01 00:00:00' 에서 '9999-12-31 23:59:59'

TIMESTAMP[(M)]
- 범위 : '1970-01-01 00:00:00' 에서 2037

출처:http://jpss.ta3ke.com/59

 

'DB > Mysql' 카테고리의 다른 글

Mysql 데이터 타입  (0) 2013.06.21
MySQL 기본 쿼리문 정리  (0) 2013.06.17

 

 

'DB > Mysql' 카테고리의 다른 글

TIMESTAMP 특성  (0) 2013.10.17
MySQL 기본 쿼리문 정리  (0) 2013.06.17

(데이터베이스 조회)
mysql> show databases;


(데이터베이스 사용)
mysql> use 데이터베이스이름; 


(데이터베이스 생성)
mysql> create database 데이터베이스이름;

(데이터베이스 삭제)
mysql> drop database 데이터베이스이름;


(테이블 삽입)
mysql> use 데이터베이스이름;

mysql> create table 테이블이름(

->id varchar(128), //필드 자료형 옵션,

->pw varchar(128), //필드 자료형 옵션

->);



(테이블 조회)
mysql> desc 테이블이름;


(테이블 삭제)
mysql> drop table 테이블이름;


(레코드 추가)
mysql> inisert into 테이블이름 value('내용','내용');


(레코드 선택 추가)
mysql> insert into 테이블이름 (필드, 필드) value('내용','내용');


(레코드 암호화)
mysql> insert into 테이블이름 (필드) value(password('내용'));


(레코드 조회)
mysql> select *from 테이블이름;



(레코드 선택조회)
mysql> select 필드 from 테이블이름;


(레코드 검색 조회)
mysql> select * from 테이블이름 where 필드='내용';


(레코드 삭제)
mysql> delete from 테이블이름 where 필드='내용';


(레코드 수정)
mysql> update 테이블이름 set 필드='바꿀내용' where 필드='바꾸기 전 내용';

'DB > Mysql' 카테고리의 다른 글

TIMESTAMP 특성  (0) 2013.10.17
Mysql 데이터 타입  (0) 2013.06.21

+ Recent posts