웹 페이지에서 콘텐츠 정보를 수정할 수 없는 경우 분명히 access_log 레코드가 정상이고 error_log가 나타나지 않으면 DB my.cnf를 의심합니다.
서버가 이전된 경우 이전 서버를 확인하시기 바랍니다.
이전 서버에서
mysql -u 루트 -p
@@sql_mode를 선택하십시오.
@@GLOBAL.sql_mode 선택;
@@SESSION.sql_mode를 선택합니다.
이러한 값을 그대로 확인하고 my.cnf에서 수정해야 합니다.
MariaDB((없음)) > @@sql_mode 선택;
+————————————————- — —————————————–+
| @@sql_mode |
+————————————————- — —————————————–+
| STRICT_TRANS_TABLES, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION |
+————————————————- — —————————————–+
그룹의 1행(0.000초)
MariaDB((없음)) > @@GLOBAL.sql_mode 선택;
+————————————————- — —————————————–+
|@@GLOBAL.sql_schema |
+————————————————- — —————————————–+
| STRICT_TRANS_TABLES, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION |
+————————————————- — —————————————–+
그룹의 1행(0.000초)
MariaDB((없음)) > @@SESSION.sql_mode 선택;
+————————————————- — —————————————–+
|@@SESSION.sql_mode |
+————————————————- — —————————————–+
| STRICT_TRANS_TABLES, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION |
+————————————————- — —————————————–+
그룹의 1행(0.000초)
vi /etc/my.cnf
sql_mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
위의 설정을 권장합니다
sql_mode 설정
ONLY_FULL_GROUP_BY
선택 목록, HAVING 조건 또는 ORDER BY 목록이 GROUP BY 절에 이름이 지정되지 않은 열 또는 GROPU BY 열에 있는 유일한 열(예: 기본 키 또는 고유 키)을 참조하는 경우 쿼리 총계는 거부됩니다.
STRICT_TRANS_TABLES
가능할 때마다 트랜잭션 및 비트랜잭션 스토리지 엔진에 엄격한 SQL 모드를 활성화하십시오.
엄격한 SQL 모드
Strict 모드는 MySQL이 INSERT 또는 UPDATE와 같은 데이터 수정 구문에서 유효하지 않거나 누락된 값을 처리하는 방법을 제어합니다.
여러 가지 이유로 값이 유효하지 않게 될 수 있습니다.
예를 들어 열의 데이터 유형이 잘못되었거나 범위를 벗어난 경우입니다.
DEFAULT가 명시적으로 정의되지 않은 NULL이 아닌 열에 새 행을 삽입할 때 값이 없으면 값이 누락됩니다(NULL 열의 경우 값이 없으면 NULL이 삽입됨).
Strict 모드는 CREATE TABLE과 같은 DDL 구문에도 영향을 미칩니다.
NO_ZERO_IN_DATE
NO_ZERO_IN_DATE 모드는 서버가 0년이 아닌 부분 또는 0일 부분이 있는 날짜를 허용하는지 여부에 영향을 줍니다.
(이 모드는 ‘0000–00–00’이 아니라 2010–00–01’ 또는 ‘2010–01–00’과 같은 날짜에 영향을 미칩니다. ‘0000–00–00’이 서버에서 허용되는지 여부를 제어합니다. 다음을 사용해야 합니다. 이를 수행하려면 NO_ZERO_DATE 모드).
NO_ZERO_IN_DATE의 효과는 엄격한 SQL 모드의 활성화 여부에 따라 다릅니다.
이 모드가 비활성화되면 0이 포함된 날짜가 허용되며 삽입 시 경고가 발생하지 않습니다.
이 모드를 사용하면 0이 포함된 날짜가 경고와 함께 “0000–00–00″으로 삽입됩니다.
이 모드와 엄격 모드가 모두 활성화된 경우 0이 포함된 날짜는 허용되지 않으며 삽입 시 IGNORE가 제공되지 않는 한 오류가 발생합니다. INSERT IGNORE가 UPDATE IGNORE를 실행할 때 0이 포함된 날짜는 경고와 함께 ‘0000–00–00’으로 삽입됩니다.
NO_ZERO_IN_DATE는 MySQL 8.0에서 더 이상 사용되지 않습니다.
NO_ZERO_IN_DATE는 엄격 모드의 일부가 아니며 엄격 모드와 함께 사용해야 하며 기본적으로 활성화되어 있습니다.
엄격 모드를 활성화하지 않고 NO_ZERO_IN_DATE를 활성화하면 경고가 발생하며 그 반대의 경우도 마찬가지입니다.
NO_ZERO_DATE
NO_ZERO_DATE 모드는 서버가 “0000-00-00″을 유효한 날짜로 수락하는지 여부에 영향을 줍니다. 이 모드는 엄격한 SQL 모드의 활성화 여부에 따라 다른 효과를 가집니다.
이 모드를 비활성화하면 ‘0000–00–00’이 허용되며 삽입 시 경고가 발생하지 않습니다.
이 모드가 활성화되면 ‘0000–00–00’이 허용되고 삽입 시 경고가 발생합니다.
이 모드와 엄격 모드가 모두 활성화된 경우 ‘0000–00–00’은 허용되지 않으며 삽입 시 IGNORE가 제공되지 않으면 오류가 발생합니다.
INSERT IGNORE 및 UPDATE IGNORE의 경우 ‘0000-00–00’을 허용하고 삽입 시 경고합니다.
NO_ZERO_DATE는 MySQL 8.0에서 더 이상 사용되지 않습니다. NO_ZERO_DATE는 엄격 모드의 일부가 아니며 엄격 모드와 함께 사용해야 하며 기본적으로 활성화되어 있습니다.
엄격 모드를 활성화하지 않고 NO_ZERO_DATE를 활성화하면 경고가 발생하며 그 반대의 경우도 마찬가지입니다.
ERROR_FOR_DIVISION_BY_ZERO
0으로 나누기 처리에 영향을 주는 MOD(N,0)를 포함합니다. 데이터 변경(INSERT, UPDATE)의 경우 엄격한 SQL 모드가 활성화되었는지 여부에 따라 영향이 달라집니다.
이 모드가 비활성화되면 0으로 나누면 경고 없이 NULL 값이 삽입됩니다.
이 모드가 활성화되면 0으로 나누면 NULL 값이 삽입되고 경고가 발생합니다.
이 모드가 엄격 모드와 함께 활성화되면 IGNORE가 제공되지 않는 한 0으로 나누면 오류가 발생합니다.
INSERT IGNORE 및 UPDATE IGNORE의 경우 NULL 값을 입력하고 0으로 삽입 나누기 경고합니다.
SELECT의 경우 0으로 나누면 NULL이 반환됩니다.
ERROR_FOR_DIVISION_BY_ZERO가 활성화되면 엄격 모드 활성화 여부에 관계없이 경고가 발생합니다.
MySQL 8.0에서 ERROR_FOR_DIVISION_BY_ZERO는 더 이상 사용되지 않습니다.
ERROR_FOR_DIVISION_BY_ZERO는 엄격 모드의 일부가 아니며 엄격 모드와 함께 사용해야 하며 기본적으로 활성화되어 있습니다.
엄격 모드가 활성화되지 않은 경우 ERROR_FOR_DIVISION_BY_ZERO를 활성화하고 그 반대의 경우도 마찬가지입니다.
NO_ENGINE_SUBSTITUITION
CREATE TABLE 또는 ALTER TABLE과 같은 문을 비활성화할지 또는 컴파일되지 않은 스토리지 엔진이 지정된 경우 기본 스토리지 엔진으로 자동 폴백할지 여부를 제어합니다.
NO_ENGINE_SUBSTITUTION은 기본적으로 활성화되어 있습니다.
런타임에 스토리지 엔진을 연결할 수 있으므로 사용할 수 없는 엔진은 다음과 같이 처리됩니다.
NO_ENGINE_SUBSTITUTION이 비활성화된 경우 기본 엔진이 CREATE TABLE에 사용되며 필요한 엔진을 사용할 수 없는 경우 경고가 생성됩니다. ALTER TABLE의 경우 경고가 발행되고 테이블이 변경되지 않습니다.
NO_ENGINE_SUBSTITUTION이 활성화된 경우 필요한 엔진을 사용할 수 없으면 오류가 발생하고 테이블이 생성되거나 수정되지 않습니다.