[mysql] MySQL에서 텍스트 열이 기본값을 가질 수없는 이유는 무엇입니까?

테이블에서 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'

문제가 해결되었습니다.