테이블에서 TEXT 열을 만들고 MySQL에서 기본값을 지정하려고하면 오류가 발생합니다 (적어도 Windows에서는). 텍스트 열에 기본값이 없어야하는 이유를 알 수 없습니다. MySQL 문서에는 설명이 없습니다. 그것은 나에게 비논리적 인 것 같습니다 (그리고 기본값을 원하기 때문에 다소 실망 스럽습니다!). 왜 이것이 허용되지 않는지 아십니까?
답변
Windows MySQL v5에서 오류가 발생하지만 Linux 및 기타 버전에서는 경고 만 발생합니다. 이 문제를 해결해야합니다. WTF?
또한 MySQL Bugtracker에서 버그 # 19498로이 문제를 해결하려는 시도를보십시오.
Bryce Nesbitt 2008 년 4 월 4 일 4:36 pm :
MS Windows에서는 “무결점”규칙이 오류 인 반면 다른 플랫폼에서는 종종 경고입니다. 버그는 아니지만 관대 한 플랫폼에서 코드를 작성하고 나중에 엄격한 플랫폼에서 실행하면이 문제에 갇힐 수 있습니다.
개인적으로 나는 이것을 버그로 본다. “BLOB / TEXT 열은 기본값을 가질 수 없습니다”를 검색하면 Google에서 약 2,940 개의 결과가 반환됩니다. 대부분은 한 시스템에서는 작동하지만 다른 시스템에서는 작동하지 않는 DB 스크립트를 설치하려고 할 때 비 호환성에 대한보고입니다.
원래 Linux MySQL v5.0.83-log에 배포 된 클라이언트 중 하나를 수정하는 webapp에서 동일한 문제가 발생했습니다. Windows MySQL v5.1.41을 실행 중입니다. 최신 버전의 phpMyAdmin을 사용하여 데이터베이스를 추출하려고 시도하더라도 해당 텍스트 열의 기본값을보고하지 않습니다. 그러나 Windows에서 삽입을 실행하려고하면 (Linux 배포에서 잘 작동 함) ABC 열에 기본값이 없다는 오류가 발생합니다. 명백한 기본값 (해당 열의 고유 값 선택에 따라)을 사용하여 테이블을 로컬로 다시 만들고 결국 너무 유용한 BLOB / TEXT 열에 기본값을 가질 수 없습니다 .
다시 말하지만, 플랫폼 간 기본 호환성을 유지하지 않는 것은 용납 할 수 없으며 버그입니다.
MySQL 5에서 엄격 모드를 비활성화하는 방법 (Windows) :
-
/my.ini를 편집하고 줄을 찾으십시오.
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
-
로 교체
sql_mode='MYSQL40'
-
MySQL 서비스를 다시 시작하십시오 (mysql5라고 가정).
net stop mysql5 net start mysql5
루트 / 관리자 액세스 권한이 있으면 실행할 수 있습니다.
mysql_query("SET @@global.sql_mode='MYSQL40'");
답변
mySQL 엔진에 대한 깊은 지식이 없으면 메모리 절약 전략처럼 들립니다. 나는 그 이유가 문서 에서이 단락 뒤에 있다고 가정합니다 .
각 BLOB 또는 TEXT 값은 내부적으로 별도로 할당 된 객체로 표시됩니다. 이는 테이블을 열 때 열당 한 번 스토리지가 할당되는 다른 모든 데이터 유형과 대조됩니다.
이러한 열 유형을 미리 채우면 메모리 사용 및 성능 저하가 발생할 수 있습니다.
답변
트리거를 사용하여 기본값과 동일한 효과를 얻을 수 있습니다
create table my_text
(
abc text
);
delimiter //
create trigger mytext_trigger before insert on my_text
for each row
begin
if (NEW.abc is null ) then
set NEW.abc = 'default text';
end if;
end
//
delimiter ;
답변
주요 질문으로 :
왜 이것이 허용되지 않는지 아십니까?
여전히 답을 얻지 못했지만 빠른 검색을 수행하고 MySQL Bugs 의 MySQL 개발자가 비교적 새로 추가 한 것을 발견했습니다 .
[2017.03.17 15:11] Ståle Deraas
개발자가 게시 :
이것은 실제로 유효한 기능 요청이며 언뜻보기에는 추가하기가 쉽지 않을 수 있습니다. 그러나 TEXT / BLOBS 값은 테이블 읽기 / 업데이트에 사용되는 레코드 버퍼에 직접 저장되지 않습니다. 따라서 기본값을 할당하는 것이 조금 더 복잡합니다.
이것은 명확한 답은 아니지만 적어도 왜 질문에 대한 출발점 입니다.
그 사이에 코드를 작성하고 열을 nullable로 만들거나 응용 프로그램 코드에서 ''
각각에 대해 (default ) 값을 명시 적으로 할당합니다 insert
.
답변
“TEXT / BLOB 열의 DEFAULT 지원”은 MySQL Bugtracker (버그 # 21532) 의
기능 요청입니다 .
TEXT 열에 기본값을 설정하려는 유일한 사람이 아닙니다. 이 기능은 이후 버전의 MySQL에서 지원되어야한다고 생각합니다.
이 기능을 지원하지 않는 (현재) 데이터베이스와 지원하는 데이터베이스 사이에서 데이터베이스를 앞뒤로 전송하려는 경우 비 호환성 및 데이터 손실이 발생할 수 있으므로 MySQL 버전 5.0에서는이 문제를 해결할 수 없습니다. 그 기능.
답변
나는 일반적으로 Linux에서 사이트를 실행하지만 로컬 Windows 시스템에서도 개발합니다. 나는이 문제를 여러 번 겪었고 문제가 발생했을 때 테이블을 수정했습니다. 어제 누군가를 도와 문제를 다시 겪을 수 있도록 앱을 설치했습니다. 그래서 나는 무슨 일이 일어나고 있는지 알아낼 시간이라고 결정 하고이 스레드를 발견했습니다. 서버의 sql_mode를 이전 모드 (기본적으로)로 변경하는 아이디어가 마음에 들지 않으므로 간단한 (내 생각) 솔루션을 생각해 냈습니다.
물론이 솔루션을 사용하려면 개발자가 Windows에서 실행되는 MySQL 문제를 보완하기 위해 테이블 작성 스크립트를 래핑해야합니다. 덤프 파일에서도 비슷한 개념을 볼 수 있습니다. 큰 경고 중 하나는 파티셔닝을 사용하는 경우 문제가 발생할 수 있다는 것입니다.
// Store the current sql_mode
mysql_query("set @orig_mode = @@global.sql_mode");
// Set sql_mode to one that won't trigger errors...
mysql_query('set @@global.sql_mode = "MYSQL40"');
/**
* Do table creations here...
*/
// Change it back to original sql_mode
mysql_query('set @@global.sql_mode = @orig_mode');
그게 다야.
답변
우분투 16.04의 경우 :
MySQL 5.7에서 엄격 모드를 비활성화하는 방법 :
/etc/mysql/mysql.conf.d/mysqld.cnf 파일 편집
mysql.cnf에 아래 줄이 있으면
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
그런 다음
sql_mode='MYSQL40'
그렇지 않으면
mysqld.cnf에 아래 줄을 추가하십시오.
sql_mode='MYSQL40'
문제가 해결되었습니다.