programing

MySQL 타임스탬프에 NULL 삽입

codeshow 2023. 10. 24. 21:40
반응형

MySQL 타임스탬프에 NULL 삽입

MySQL 타임스탬프 열에 NULL을 삽입/업데이트하여 예기치 않은 동작을 관찰하고 있습니다.

다음 문장을 생각해 보십시오.

create table temp(id int, hireDate timestamp default 0);
insert into temp (id) values(1);
insert into temp (id, hireDate) values(2, null);
select * from temp;
id  hireDate
-----------------------------
1   
2   2012-09-19 10:54:10.0

첫 번째 삽입(시점)hiredateSQL에 지정되지 않았습니다. hireDate는null(0)예상되는 바입니다.

그러나 SQL에서 명시적 null이 전달되면 예상치 못한 현재 날짜 시간이 삽입됩니다.왜 이런 일이 일어날까요?

참고: Hibernate는 두 번째 유형의 인서트를 사용하므로 문제가 됩니다.타임스탬프 열에 null을 삽입하려면 어떻게 해야 합니까?

http://dev.mysql.com/doc/refman/5.0/en/timestamp-initialization.html

또한 NULL 값을 허용하기 위해 NULL 속성으로 정의된 경우가 아니라면 NULL 값을 할당하여 타임스탬프 열을 현재 날짜 및 시간으로 초기화하거나 업데이트할 수 있습니다.

타임스탬프를 NULL 속성을 사용하여 생성하거나 테이블을 변경하여 NULL 속성을 추가합니다.create 문에서는 닮았습니다.

CREATE TABLE t1 (tsvalue TIMESTAMP NULL, ... );

NULL 특성이 설정된 TIMESTAMP 필드에 NULL 값을 삽입하면 필드가 NOW()가 아닌 NULL로 설정됩니다.

MySQL 타임스탬프에 NULL을 삽입하고 업데이트할 수 있습니다.

테이블 작성:

create table penguins(id int primary key auto_increment, the_time timestamp NULL);

일부 행 삽입:

insert into penguins(the_time) values (now());
insert into penguins(the_time) values (null);
insert into penguins(the_time) values (0);
insert into penguins(the_time) values ('1999-10-10 01:02:03');

인쇄되는 항목:

select * from penguins

1   2015-01-23 15:40:36
2   
3   0000-00-00 00:00:00
4   1999-10-10 01:02:03

칼럼이 호출했습니다.the_time데이터 유형:timestamp두 번째 행에 NULL 값이 있습니다.

hireDate 열의 기본값을 변경해야 합니다.기본값은 null이어야 합니다.

이것.

create table temp(id int, hireDate timestamp default 0);

다음 항목이어야 합니다.

create table temp(id int, hireDate timestamp null);

NULL을 삽입하려면hireDate테이블의 컬럼을 제공해야 합니다. 그러면 null을 제공해야 합니다.

INSERT INTO temp (id, hireDate) VALUES(3, null);

왜냐면DatatypehireDatetimestamp열을 만들 때 null로 정의해야 합니다.

애플리케이션 값을 MySQL 타임스탬프 유형 열에 저장하지 마십시오.데이터베이스 측 서버 측 동적 타임스탬프에 대해서만 타임스탬프 유형을 사용합니다(DEFAULT 및 ON UPDATE 열 특성 참조).열을 'mysql_row_created_at' 및 'mysql_row_update_at'로 지정하여 명시합니다.

MySQL은 타임스탬프 유형을 숫자 UNIX-epoch-delta로 물리적으로 저장하므로 UTC의 암시적 시간대를 가지며, 이는 세션(AKA 연결) 수준의 시간대 변경에 영향을 주지 않습니다.

알려진 시간대를 가진 값을 저장할 때는 더욱 '날짜 시간' 유형을 멀리하십시오.datetime' 유형은 꽉 찬 숫자의 문자열과 매우 유사합니다.그것과 함께 저장된 시간대 정보는 없습니다.

'날짜' 유형은 일반적으로 사용해도 무방합니다.그러나 일부 상황에서는 (활성 시간대의) 자정의 날짜 시간으로 해석되어 피해야 할 모든 '날짜 시간' 관련 혼동을 초래한다는 점에 유의해야 합니다.

응용 프로그램 측 날짜-시간 값의 경우 'intunsigned', 'bigint'(서명된), 'double'(서명된) 또는 10진수(N,P)를 사용하여 UNIX-epoch-delta를 간단히 저장합니다.초가 아닌 경우에는 해상도를 열 이름 접미사로 표시해야 합니다.

예:

`mysql_row_created_at` TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
`mysql_row_updated_at` TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

`epoch` int unsigned NOT NULL,
`epoch_ms` bigint NOT NULL,
`epoch_us` bigint NOT NULL,
`epoch` double NOT NULL,
`epoch6` decimal(16,6),

데이터베이스를 최대한 바보 같은 저장소로 처리합니다.따라서 변환 작업은 애플리케이션 측에서만 수행하고 데이터베이스 측에서는 수행하지 않습니다.

알아두면 좋은 정보:

SELECT @@GLOBAL.TIME_ZONE
, @@SESSION.TIME_ZONE
, @@SESSION.TIMESTAMP
, UNIX_TIMESTAMP(NOW(6))
;

old mysql 5.6.44-86.0에서 aurora mysql 5.7.12로 업그레이드할 때 비슷한 동작이 발생했습니다.코드가 NULL을 타임스탬프로 삽입하고 모든 0 날짜를 쓸 것으로 예상하고 대신 "열 'XXXX'는 NULL이 될 수 없습니다"라는 오류를 던졌습니다.그룹 매개 변수 explicit_defaults_for_timestamp를 0으로 설정하여 오류 없이 타임스탬프 열을 null로 삽입/업데이트할 수 있도록 하여 문제를 해결했습니다.

언급URL : https://stackoverflow.com/questions/12489078/inserting-null-into-mysql-timestamp

반응형