DATE 또는 DATETIME 기본값을 설정할 때 MySQL에서 오류가 발생함
MySql Server 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 문서에 기재되어 있습니다.
DATE 유형은 날짜 부분이 있지만 시간 부분이 없는 값에 사용됩니다.MySQL은 'YYY-MM-DD' 형식으로 DATE 값을 검색하여 표시합니다.지원되는 범위는 '1000-01-01' ~ '9999-12-31'입니다.
설령 그들이 다음과 같이 말한다 하더라도
잘못된 DATE, DATETIME 또는 TIMESTAMP 값이 적절한 유형(0000-00-00 또는 0000-00 00:00:00)의 "제로" 값으로 변환됩니다.
MySQL 문서의 두 번째 인용문도 고려했는데, 왜 이 오류가 발생하는지 알려주실 수 있나요?
이 에러는 최신 MYSQL 5.7 매뉴얼에 따라 엄밀한 모드일 수 있는sql 모드 때문입니다.
MySQL Documentation 5.7은 다음과 같습니다.
strict 모드는 서버가 '0000-00-00'을 유효 날짜로 허용하는지 여부에 영향을 줍니다.strict 모드가 활성화되지 않은 경우 '0000-00-00'이 허용되며 삽입 시 경고가 발생하지 않습니다.strict 모드가 유효하게 되어 있는 경우는, IGNORE 가 지정되어 있지 않는 한, 「0000-00-00」이 허가되지 않고, 삽입에 에러가 발생합니다.INSERT IGNORE 및 UPDATE IGNORE의 경우 '0000-00-00'이 허용되며 삽입 시 경고가 발생합니다.
MYSQL 모드를 확인하려면
SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session
STRICT_TRANS_TABLES 모드 디세이블화
, 「」의 을 할 수 .0000-00-00 00:00:00
mysql config 를 사용하여 STICT_TRANS_TABLES 를 비활성화해야 .LES ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」
명령어별
SET sql_mode = '';
또는
SET GLOBAL sql_mode = '';
" " 를 합니다.GLOBAL
로 하며, 그을 줍니다.
하지 않는 는, 「동작하지 않는 경우」로합니다./etc/mysql/my.cnf
ubuntu) 및 (per ubuntu) 。STRICT_TRANS_TABLES
서버 시 sql 을 포함합니다.SET sql_mode=''
my.cnf
Linux "MacOS", 은 「」로 가 있습니다.my.ini
filename을 클릭합니다.
메모
단, MYSQL 5.6에서는 strict 모드는 디폴트로 이니블로 되어 있지 않습니다.따라서 MYSQL 6 문서에 따라 다음과 같은 오류가 발생하지 않습니다.
MySQL을 사용하면 "0" 값인 "0000-00-00"을 "dummy date"로 저장할 수 있습니다.이 방법은 NULL 값을 사용하는 것보다 편리할 수 있으며 데이터 및 인덱스 공간을 적게 사용합니다.0000-00-00'을 허용하지 않으려면 NO_ZERO_DATE SQL 모드를 사용하도록 설정합니다.
갱신하다
@Dylan-Su가 말한 오류에 대해:
이것은 MYSQL이 시간이 지남에 따라 진화하는 방식의 버그가 아니라고 생각합니다.
또 .NOW()
「」를 참조합니다.
Datetime 필드는 기본 NOW()를 사용할 수 없습니다.
또 다른 유용한 참고 사항 [TIMESTAMP 및 DATETIME에 대한 자동 초기화 및 업데이트]를 참조하십시오.
MySQL 5.6.5부터는 TIMESTAMP 및 DATETIME 열을 자동으로 초기화하고 현재 날짜 및 시간(즉, 현재 타임스탬프)으로 업데이트할 수 있습니다.5.6.5 이전 버전에서는 TIMESTAMP에만 해당되며 테이블마다 최대 1개의 TIMESTAMP 열에 적용됩니다.다음 주에서는 먼저 MySQL 5.6.5 이상에 대한 자동 초기화 및 업데이트와 5.6.5 이전 버전의 차이점에 대해 설명합니다.
NO_ZERO_DA에 관한 갱신TE
MySQL 5.7.4부터는 이 모드가 사용되지 않습니다.이전 버전에서는 설정 파일의 각 행을 코멘트 아웃해야 합니다.NO_ZERO_DATE의 MySQL 5.7 문서를 참조하십시오.
MySql 5.7.14의 WAMP 3.0.6에서 이 오류가 발생했습니다.
솔루션:
파일이 않은 )c:\wamp\bin\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"
모든 서비스를 재시작합니다.
이렇게 하면 완전 모드가 디세블이 됩니다. mode"strict mode"는 "strict mode" 또는 둘 다 둘 다 모드를 합니다.STRICT_TRANS_TABLES
★★★★★★★★★★★★★★★★★」STRICT_ALL_TABLES
가능한.문서에는 다음과 같이 기재되어 있습니다.
MySQL 5.7의 기본 SQL 모드에는 다음과 같은 모드가 있습니다.ONLY_FULL_GROUP_BY, STRIT_TRANS_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVATION_BY_ZERO, NO_AUTO_CREATE_USER 및 NO_ENGINE_SUBTITION.
날짜 필드의 NULL과 0000-00-00 사이에 데이터가 혼재된 상황에 빠졌습니다.하지만 '0000-00-00'을 NULL로 업데이트하는 방법을 몰랐습니다.
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<'0000-01-01'
모든 '오류'가 있기 때문입니다.my_date_field
값(올바른 날짜 여부에 관계없이)은 이 날짜 이전의 값입니다.
번째로 현재 세션을 합니다.sql_mode
:
SELECT @@SESSION.sql_mode;
그러면 다음과 같은 기본값을 얻을 수 있습니다.
'ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES,No_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVATION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBITION'
그 후 설정sql_mode
없이.'NO_ZERO_DATE'
:
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 = '...';
구성 구문 문제
*nix 시스템에서 일부 버전의 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_mode = "NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
내부 파일:/etc/mysql/mysql.conf.d/mysqld.cnf
그리고나서sudo service mysql restart
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을 생성하여 문제를 재현할 수 있습니다.
MySQL 5.6 및 5.7.8에서는 동작하지만 5.7.11에서는 동작하지 않는 경우.그럼 5.7.11의 회귀 버그일 가능성이 있습니다.
MySQL Workbench에서 문제를 해결하려면(서버 측에서 솔루션을 적용한 후):
기본 설정 패널에서 SQL_MODE를 TRADIAL로 제거합니다.
MySQL 5.7에 대한 답변입니다.
best는 sql_mode에 공백으로 설정되어 있지 않습니다.대신 PHP에서 다음과 같은 세션 변수를 사용합니다.
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는 알겠습니다만, 향후 버전에서는 단종됩니다.
STICT_ALL_TABLES는 파라미터가 무시되기 전에 삭제해야 합니다.
마지막으로 TREADIAL도 그렇지만 설명서에서 잘못된 값을 열에 삽입할 때 "경고 대신 오류 제공" 매개변수에 대해 설명합니다. 이 매개변수를 사용하면 값이 0인 날짜는 삽입되지 않지만 삽입되지 않습니다.
MySQL은 이러한 파라미터와 조합으로 구성되어 있지 않습니다.
의 옵션 조합mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64)
.
던지지 않음:
STRICT_TRANS_TABLES
+NO_ZERO_DATE
던지기:
STRICT_TRANS_TABLES
+NO_ZERO_IN_DATE
의 내 설정/etc/mysql/my.cnf
Ubuntu의 경우:
[mysqld]
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
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';
다음과 같이 수정을 테스트했습니다.
1). On the file "system/library/db/mysqli.php" search and comment the line:
"$this->connection->query("SET SESSION sql_mode = 'NO_ZERO_IN_DATE,NO_ZERO_DATE,NO_ENGINE_SUBSTITUTION'");"
2) Add the following line above the one you just commented:
// Correction by Added by A.benkorich
$this->connection->query("SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY'");
데이터베이스를 선택하고 SQL 쿼리를 실행합니다.
SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session
1. 다음 명령을 사용하여 기본 날짜를 current_timestamp로 변경합니다.-
ALTER TABLE `wp_posts` CHANGE `post_date` `post_date` DATETIME NOT
NULL DEFAULT CURRENT_TIMESTAMP
2. 다음 명령을 사용하여 기본 날짜를 NULL로 변경합니다.-
ALTER TABLE `wp_posts` CHANGE `post_date` `post_date` DATETIME NOT
NULL DEFAULT NULL
3. 단일 SQL 쿼리를 사용하여 여러 열의 기본 날짜를 변경하려면 다음 명령을 사용합니다.-
ALTER TABLE `wp_posts` CHANGE `post_date` `post_date` DATETIME NOT NULL
DEFAULT CURRENT_TIMESTAMP, CHANGE `post_date_gmt` `post_date_gmt`
DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, CHANGE `post_modified`
`post_modified` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, CHANGE
`post_modified_gmt` `post_modified_gmt` DATETIME NOT NULL DEFAULT
CURRENT_TIMESTAMP;
디렉토리 xampp/mysql/bin에서 my.ini를 열고 행을 변경합니다.sql_mode for - >
"sql_mode=NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE"
REMOVE "NO_ZERO_IN_DATE"
새 프로젝트를 진행하다가 새 열을 추가하려고 했습니다.
ALTER TABLE prefix_example_table ADD COLUMN stackoverflow decimal(11,3) NOT NULL
그리고 이 오류가 발생했습니다.
#1292 - Incorrect date value: '0000-00-00'
새로운 데이터를 추가하려고 시도하지도 않은 다른 컬럼의 경우 이 오류를 반환한 컬럼에는 Date 타입의 기본값인 '0000-00-00'이 붙어 있습니다.
@geksal에서 설명한 바와 같이
strict 모드는 서버가 '0000-00-00'을 유효 날짜로 허용하는지 여부에 영향을 줍니다.strict 모드가 활성화되지 않은 경우 '0000-00-00'이 허용되며 삽입 시 경고가 발생하지 않습니다.strict 모드가 유효하게 되어 있는 경우는, IGNORE 가 지정되어 있지 않는 한, 「0000-00-00」이 허가되지 않고, 삽입에 에러가 발생합니다.INSERT IGNORE 및 UPDATE IGNORE의 경우 '0000-00-00'이 허용되며 삽입 시 경고가 발생합니다.
나는 몇 시간 동안 그 문제가 사생활과 관련이 있다고 생각했다.
이것으로 나는 일하는 시간이 절약되었다.
SET GLOBAL sql_mode = '';
언급URL : https://stackoverflow.com/questions/36374335/error-in-mysql-when-setting-default-value-for-date-or-datetime
'programing' 카테고리의 다른 글
Prepared Statement를 여러 번 재사용 (0) | 2022.10.15 |
---|---|
생성자에 인수가 있는 Java 8 공급업체 (0) | 2022.10.06 |
왜 PHP의 함수와 메서드는 대소문자를 구분하지 않는가? (0) | 2022.10.06 |
현재 디렉터리에 있는 파일만 나열 (0) | 2022.10.06 |
임시 테이블에 결합하면 쿼리가 느려지는 이유는 무엇입니까? (0) | 2022.10.06 |