programing

'create_date' 타임스탬프 필드의 기본값이 잘못되었습니다.

firstcheck 2023. 1. 1. 11:30
반응형

'create_date' 타임스탬프 필드의 기본값이 잘못되었습니다.

다음 sql create 문이 있습니다.

mysql> CREATE  TABLE IF NOT EXISTS `erp`.`je_menus` (
    ->   `id` INT(11) NOT NULL AUTO_INCREMENT ,
    ->   `name` VARCHAR(100) NOT NULL ,
    ->   `description` VARCHAR(255) NOT NULL ,
    ->   `live_start_date` DATETIME NULL DEFAULT NULL ,
    ->   `live_end_date` DATETIME NULL DEFAULT NULL , 
    ->   `notes` VARCHAR(255) NULL ,
    ->   `create_date` TIMESTAMP NOT NULL DEFAULT  '0000-00-00 00:00:00',
    ->   `created_by` INT(11) NOT NULL ,
    ->   `update_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP  ,
    ->   `updated_by` INT(11) NOT NULL , 
    ->   `status` VARCHAR(45) NOT NULL ,
    ->   PRIMARY KEY (`id`) ) 
    -> ENGINE = InnoDB;

다음 오류 발생

ERROR 1067 (42000): Invalid default value for 'create_date'

여기 뭐가 잘못됐나요?

이는 서버 SQL 모드 - NO_ZERO_DATE 때문입니다.

★★★★★★★★★★★★★★★★★★★~NO_ZERO_DATE 돼요 - strict 모 、 doesn 、 doesn 、 - 、 - - - - - - - - - - - - - - - - 。'0000-00-00'유효일자로 합니다.IGNORE 옵션을 사용하여 계속 0 날짜를 삽입할 수 있습니다.strict 모드가 아닌 경우 날짜는 허용되지만 경고가 생성됩니다.

MySQL 워크벤치에서 스크립트를 생성한 경우.

다음 행이 생성됩니다.

SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

SQL_MODE에서 TRADIAL을 삭제하면 스크립트는 정상적으로 동작합니다.

또는 SQL_MODE를 잘못된 날짜 허용으로 설정할 수 있습니다.

SET SQL_MODE='ALLOW_INVALID_DATES';

TIMESTAMP의 범위는 '1970-01-01 00:00:01' UTC ~ '2038-01-19 03:14:07'입니다(문서 참조).기본값은 이 범위 내에 있어야 합니다.

기타 이상하고 관련된 동작:

CREATE TABLE tbl1 (
    ts TIMESTAMP);  
Query OK, 0 rows affected (0.01 sec)

CREATE TABLE tbl2 (
    ts TIMESTAMP,
    ts2 TIMESTAMP);
ERROR 1067 (42000): Invalid default value for 'ts2'

CREATE TABLE tbl3 (
    ts TIMESTAMP,
    ts2 TIMESTAMP DEFAULT '1970-01-01 00:00:01');
Query OK, 0 rows affected (0.01 sec)

NULLS를 삽입하려면 다음 사항을 참고하십시오.

CREATE TABLE tbl4 (
    ts TIMESTAMP NULL DEFAULT NULL);

ubuntu 데스크톱 16.04에서는 다음과 같이 했습니다.

  1. 있는 파일: " " open열 open :/etc/mysql/mysql.conf.d/mysqld.cnf하하는편편편편선선선 선선선선선

  2. sql_mode[mysqld].

  3. 를 설정합니다.sql_mode음음음같 뭇매하다

    NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

  4. 다음 절차를 수행하여 mysql 서비스를 저장한 후 재시작합니다.

    sudo service mysql restart

데이터베이스 SQL 파일 맨 위에 다음 행을 정의하십시오.

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

나한텐 효과가 있어.

OS X를 사용하여 컴파일된 기본값을 기반으로 Homebrew 시스템 변수에서 mysql을 설치합니다.해결책은 시스템 변수 "sql_mode"에서 "NO_ZERO_DATE"를 삭제하는 것입니다.

범위가 포함된다는 것을 명심하세요.

을 주고 는, 「 」를 사용해 ."@@session"예를 들어 다음과 같습니다.

SET @@session.sql_mode ="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION".

이 경우 세션이 종료되거나 세션이 변경된 후에는 영향을 주지 않습니다.다른 세션에는 영향을 주지 않습니다.

클라이언트에 을 주고 는, 「」를 사용해 ."@@global"예를 들어 다음과 같습니다.

SET @@global.sql_mode ="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION".

이 경우 변경 후 접속하는 클라이언트에만 영향을 주고(현재 모든 클라이언트에는 영향을 주지 않음) 서버가 종료되면 작동하지 않습니다.

MySQL 5.7에서도 다음 코드와 같은 문제가 있었습니다.

`update_date` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP

대신 다음과 같이 수정했습니다.

`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP

하려면 , 「」를 삭제할 가 있습니다.NO_ZERO_DATE.mysql "Configuration" 에서 합니다.

  1. 'phpmyadmin'으로 이동합니다.
  2. phpmyadmin이 로드되면 '변수' 탭을 클릭합니다.
  3. 'sql 모드'를 검색합니다.
  4. [] 을 클릭하여 [편집(Edit(Edit(Edit)]를 삭제합니다.NO_ZERO_DATE(및 그 말미의 쉼표)를 설정으로부터 취득합니다.

이는 wamp 또는 xamp를 사용하는 로컬 환경에서 매우 일반적인 문제입니다.

Homebrew에서 MySQL을 설치하여 OS X에서 이 문제를 해결할 수 있었습니다.

brew install mysql

/usr/local/etc/my.cnf에 다음 항목을 추가합니다.

sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

및 MySQL 재시작

brew tap homebrew/services
brew services restart mysql

엄격한 SQL 모드를 실행 중지하려면 다음과 같이 하십시오.

Create disable_strict_mode.cnf file at /etc/mysql/conf.d/

파일에 다음 두 줄을 입력합니다.

[mysqld]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

마지막으로 다음 명령으로 MySQL을 재시작합니다.

sudo service mysql restart

기본값은 1000년부터 시작해야 합니다.

예를들면,

ALTER TABLE mytable last_active DATETIME DEFAULT '1000-01-01 00:00:00'

이게 도움이 됐으면 좋겠네요.

변경:

`create_date` TIMESTAMP NOT NULL DEFAULT  '0000-00-00 00:00:00',
`update_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP  ,

수신처:

`create_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP ,
`update_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,

이렇게 많은 답을 보게 되어 신기하지만, 아무도 "제로" 날짜 형식이 잘못되었다는 주요 이유를 명시하지 않았습니다.즉, '0000-00-00 00:00:00' 대신 '0000-01-01 00:00:00'를 사용하십시오.월 00과 일 00은 모두 유효한 값이 아닙니다.

MySQL 설정 NO_ZERO_DATE로 인해 발생한 오류라는 상위 사용자 의견에 동의합니다.이 설정은 새로운 MySQL 서버 릴리스에서 기본적으로 사용되도록 도입되었습니다.많은 개발자가 깜짝 놀랐습니다.다만, 이 설정의 주된 목적은 개발자의 생활을 어렵게 하는 것이 아니라, 낡은 테이블 구조를 수정해, 향후 이러한 잘못된 데이터 구조 형식을 사용하지 않게 하는 것입니다.

따라서 새 테이블을 만들고 "ZERO" 날짜를 지정하려면 '0000-01-01 00:00:00'를 사용하십시오.

이미 테이블을 만들었는데 이 오류가 발생한 경우(예: 기본값을 생략한 새 레코드를 삽입하는 경우) 테이블을 다음과 같이 업데이트합니다.

ALTER TABLE `erp`.`je_menus` 
MODIFY COLUMN `create_date` datetime(0) NOT NULL DEFAULT '0000-01-01 00:00:00'  AFTER `notes`;

전술한 서버 설정을 삭제하는 것은 일시적인 해결책일 뿐, 베스트 프랙티스의 예는 아닙니다.

서버에 대한 관리 권한이 없는 경우 현재 세션에 대해 sql 모드를 설정할 수 있습니다.

SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

MySql 인스턴스의 시간대 설정을 검토할 수 있습니다.

mysql> show variables like 'time_zone';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| time_zone     | SYSTEM |
+---------------+--------+

제 경우 기본 시스템의 타임존이 UTC가 아닌 BST로 설정되어 있음을 깨달았습니다.따라서 작성 테이블에서는 기본값인 1970-01 00:00:01이 1시간 뒤로 강제되어 타임스탬프 값이 비활성화되었습니다.

저는 사실 머신의 타임존을 UTC로 설정하고 싶었고, 그것이 저를 정리했습니다.Centos/7을 실행하면서 단순히

# timedatectl set-timezone UTC

모든 걸 다시 시작했어

이것을 변경할 수 있습니다.

`create_date` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',

이런 거에 대해서:

`create_date` TIMESTAMP NOT NULL DEFAULT '2018-04-01 12:00:00',
ALTER TABLE `wp_actionscheduler_actions` CHANGE `scheduled_date_gmt` `scheduled_date_gmt` DATETIME NULL DEFAULT CURRENT_TIMESTAMP, CHANGE `scheduled_date_local` `scheduled_date_local` DATETIME NULL DEFAULT CURRENT_TIMESTAMP, CHANGE `last_attempt_gmt` `last_attempt_gmt` DATETIME NULL DEFAULT CURRENT_TIMESTAMP, CHANGE `last_attempt_local` `last_attempt_local` DATETIME NULL DEFAULT CURRENT_TIMESTAMP; 

컬럼의 종류를 '타임 스탬프'로 설정하려고 하면 효과가 있습니다.

이것을 변경할 수 있습니다.

create_dateDEFAULT ' datetime NOT NULL '0000-00 00:00:00',

이런 거에 대해서:

create_dateDEFAULT ' varchar(80)는 '0000-00-00 00:00:00',

언급URL : https://stackoverflow.com/questions/9192027/invalid-default-value-for-create-date-timestamp-field

반응형