복붙노트

[SQL] MySQL의 오류 때 DATE 또는 DATETIME에 대한 기본 값을 설정

SQL

MySQL의 오류 때 DATE 또는 DATETIME에 대한 기본 값을 설정

나는 MySQL 서버 5.7.11이 문장을 실행 해요 :

updated datetime NOT NULL DEFAULT '0000-00-00 00:00:00'

작동하지 않는다. 오류주기 :

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

그러나 다음과 같은 :

updated datetime NOT NULL DEFAULT '1000-01-01 00:00:00'

바로 작동합니다.

DATE의 같은 경우.

(!) 참고로, 그것은 MySQL의 문서에 언급되어있다 :

그들은 또한 뭐니해도 :

그것은 그 오류를주는 이유 계정으로도 MySQL의 문서에서 두 번째 견적을 갖는, 사람이 알려주 수 있을까?

해결법

  1. ==============================

    1.오류 때문에 최신 MYSQL 5.7 문서에 따라 엄격 모드 될 수있는 SQL 모드입니다

    오류 때문에 최신 MYSQL 5.7 문서에 따라 엄격 모드 될 수있는 SQL 모드입니다

    MySQL의 문서 5.7는 말한다 :

    MYSQL 모드를 확인하려면

    SELECT @@ GLOBAL.sql_mode 글로벌 @@ SESSION.sql_mode 세션

    비활성화 STRICT_TRANS_TABLES 모드

    그러나 형식을 0000-00-00 00 수 있도록 : 00 :시 취침 MySQL의 설정 파일에서 또는 명령에 의해 비활성화 STRICT_TRANS_TABLES 모드로이

    명령

    SET sql_mode = '';

    또는

    SET GLOBAL의 sql_mode = '';

    키워드를 사용하여 글로벌 슈퍼 권한이 필요하며 모든 클라이언트에 그 시간에서 연결 작업에 영향을 미치는

    STRICT_TRANS_TABLES에서 (우분투에 따라) /etc/mysql/my.cnf에 이동보다 작업 및 주석하지 않습니다 위의 경우

    영구적 서버 시작시 SQL 모드를 설정하려는 경우 또한, 다음 리눅스 나 맥 OS에 my.cnf 파일에 SET의 sql_mode을 = ''등이 있습니다. 창문이있는 my.ini 파일에서 수행되어야한다.

    노트

    그러나 엄격 모드는 MYSQL 5.6에서 기본적으로 사용할 수 없습니다. 따라서 그것은 말한다 MYSQL 6 문서에 따라 오류를 생성하지 않습니다

    최신 정보

    딜런 - 스와 @ 말했다로 버그 문제에 대해서 :

    나는이는 방식 MYSQL은 몇 가지가 제품의 추가 개선에 따라 변경으로 인한되는 시간에 걸쳐 진화하는 버그라고 생각하지 않습니다.

    그러나 나는 지금에 대한 또 다른 관련 버그 리포트를 () 함수

    날짜 시간 필드) (기본적를 허용하지 않습니다

    또 다른 유용한 참고 [TIMESTAMP와 DATETIME에 대한 자동 초기화 및 업데이트를 참조]

    업데이트에 관한 NO_ZERO_DATE

    MySQL의 현재 5.7.4의이 모드는 사용되지 않습니다. 이전 버전 사용자는 설정 파일의 각 행을 주석 처리해야합니다. NO_ZERO_DATE에서 MySQL 5.7 문서를 참조하십시오

  2. ==============================

    2.나는 MySQL은 5.7.14와 WAMP 3.0.6이 오류가 있었다.

    나는 MySQL은 5.7.14와 WAMP 3.0.6이 오류가 있었다.

    해결책:

    변화 라인 70 ℃에서 (당신의 INI 파일이 훼손되지 않은 경우) : \ WAMP \ 빈 \ mysql을 \ mysql5.7.14 \의 my.ini 파일에서

    sql-mode= "STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"
    

    sql-mode="ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"
    

    모든 서비스를 다시 시작합니다.

    이것은 엄격 모드를 비활성화합니다. 문서에 따라, "엄격 모드"를 사용할 수 STRICT_TRANS_TABLES 또는 STRICT_ALL_TABLES 중 하나 또는 둘 모두와 모드를 의미한다. 문서는 말합니다 :

  3. ==============================

    3.나는 데이터가 날짜 필드에 NULL과 0000-00-00 사이의 혼합 상황에있어. 하지만, 때문에 NULL로 '0000-00-00'를 업데이트하는 방법을 알고하지 않았다

    나는 데이터가 날짜 필드에 NULL과 0000-00-00 사이의 혼합 상황에있어. 하지만, 때문에 NULL로 '0000-00-00'를 업데이트하는 방법을 알고하지 않았다

     update my_table set my_date_field=NULL where my_date_field='0000-00-00'
    

    더 이상 허용되지 않습니다. 내 해결 방법은 아주 간단했다 :

    update my_table set my_date_field=NULL where my_date_field<'1000-01-01'
    

    모든 잘못된 my_date_field 값 (정확한 날짜 여부)이 날짜 이전부터 있었기 때문에.

  4. ==============================

    4.MYSQL의 일부 버전에서 (5.7 테스트. *) * 괜찬아 체제에서이 구문을 사용한다 :

    MYSQL의 일부 버전에서 (5.7 테스트. *) * 괜찬아 체제에서이 구문을 사용한다 :

    [mysqld]
    
    sql-mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_ENGINE_SUBSTITUTION"
    

    따옴표를 대시 없다

    sql-mode=NO_ENGINE_SUBSTITUTION
    

    따옴표 밑줄

    sql_mode=NO_ENGINE_SUBSTITUTION
    

    밑줄 따옴표

    sql_mode="NO_ENGINE_SUBSTITUTION"
    

    설정 값과 SQL 모드의 더 완전한 검토 :

    어떻게 설정 영구적는 SQL 모드 플래그에

  5. ==============================

    5.먼저 현재 세션 sql_mode를 선택 :

    먼저 현재 세션 sql_mode를 선택 :

    SELECT @@SESSION.sql_mode;
    

    그럼 당신은 그 디폴트 값 같은 것을 얻을 것이다 :

    다음 'NO_ZERO_DATE'없이 sql_mode을 설정합니다 :

    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을 위해 또한 그것을 할 수 있습니다 :

    SELECT @@GLOBAL.sql_mode;
    SET GLOBAL sql_mode = '...';
    
  6. ==============================

    6.그냥 줄을 추가 : sql_mode = "NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION"

    그냥 줄을 추가 : sql_mode = "NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION"

    내부 파일 : /etc/mysql/mysql.conf.d/mysqld.cnf

    다음 서비스 mysql을 다시 시작 SUDO

  7. ==============================

    7.그것은 5.7.8 작동 :

    그것은 5.7.8 작동 :

    mysql> create table t1(updated datetime NOT NULL DEFAULT '0000-00-00 00:00:00');
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> show create table t1;
    +-------+-------------------------------------------------------------------------------------------------------------------------+
    | Table | Create Table                                                                                                            |
    +-------+-------------------------------------------------------------------------------------------------------------------------+
    | t1    | CREATE TABLE `t1` (
      `updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
    +-------+-------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> select version();
    +-----------+
    | version() |
    +-----------+
    | 5.7.8-rc  |
    +-----------+
    1 row in set (0.00 sec)
    

    당신은 당신의 문제를 재현하는 SQLFiddle을 만들 수 있습니다.

    http://sqlfiddle.com/

    그것은 MySQL을 5.6과 5.7.8을 위해 작동하지만, 5.7.11에 실패합니다. 그 다음은 아마 5.7.11에 대한 회귀 버그.

  8. ==============================

    8.(서버 측의 용액을 도포 한 후) MySQL 워크 벤치의 문제점을 해결하려면

    (서버 측의 용액을 도포 한 후) MySQL 워크 벤치의 문제점을 해결하려면

    환경 설정 패널에서 전통에 SQL_MODE를 제거합니다.

  9. ==============================

    9.이 답변 그냥 MySQL을 5.7을위한이다 :

    이 답변 그냥 MySQL을 5.7을위한이다 :

    베스트 정말 대신 PHP 세션 변수에 사용, 빈 sql_mode에 설정되지 않은 :

    SET SESSION sql_mode= 'ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
    

    그래서 적어도 당신은 다른 기본값을 유지합니다.

    그것은 MySQL의 문서가 명확하지 않은 경우, 당신은 sql_mode이 기본 값을 삭제 필요 미친 :

    NO_ZERO_IN_DATE, NO_ZERO_DATE, 나는 이해하지만 미래의 versiones이 중단됩니다.

    매개 변수가 무시되기 전에 STRICT_ALL_TABLES이와 함께, 그래서 당신은 너무 삭제할 필요가있다.

    마지막으로 전통도이 매개 변수에 대한 문서가 말하는 그러나이 매개 변수를 사용하여, 열 "에 잘못된 값을 삽입 할 때"대신 경고의 오류를 줄 ", 0 값과 날짜는하지만 네없이 삽입되지 않았습니다.

    MySQL은 정말 이러한 매개 변수와 조합으로 조직되지 않습니다.

  10. ==============================

    10.MySQL의 버전 14.14 DISTRIB 5.7.18, Linux 용 (x86_64에)에 대한 옵션 조합.

    MySQL의 버전 14.14 DISTRIB 5.7.18, Linux 용 (x86_64에)에 대한 옵션 조합.

    포기하지 않는다 :

    STRICT_TRANS_TABLES + NO_ZERO_DATE

    예외 :

    STRICT_TRANS_TABLES + NO_ZERO_IN_DATE

    우분투에 /etc/mysql/my.cnf에서 내 설정 :

    [mysqld]
    sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
    
  11. ==============================

    11.

    set global sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
    
  12. from https://stackoverflow.com/questions/36374335/error-in-mysql-when-setting-default-value-for-date-or-datetime by cc-by-sa and MIT license