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


184

테이블에서 TEXT 열을 만들고 MySQL에서 기본값을 지정하려고하면 오류가 발생합니다 (적어도 Windows에서는). 텍스트 열에 기본값이 없어야하는 이유를 알 수 없습니다. MySQL 문서에는 설명이 없습니다. 그것은 나에게 비논리적 인 것 같습니다 (그리고 기본값을 원하기 때문에 다소 실망 스럽습니다!). 왜 이것이 허용되지 않는지 아십니까?


1
사용한 검색어를 볼 수 있습니까?
Robert

2
VARCHAR 열이 아닌 TEXT 열을 원하십니까? TEXT 열은 길이가 255 바이트를 초과 할 수있는 항목을위한 것입니다.
scy

5
이것은 의견이어야합니다. 또한, 그는 의미합니다 TEXT-그 열은 기본값을 가질 수 없습니다. VARCHAR할 수있다.
Pekka

1
phpmyadmin을 사용하여 데이터베이스를 설정하는 경우 mysql gui 도구 / 워크 벤치 ...;)를 조사 할 수 있습니다.
dmp

1
예, 불행히도 255 자 이상이 필요합니다.
Russ

답변:


92

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'");

3
루트 액세스 권한이 있고 phpMyAdmin을 사용중인 경우 기본 페이지 (phpMyAdmin 로고 클릭)로 이동하여 변수 탭으로 이동하여 sql_mode 변수를 찾은 후 편집을 클릭하십시오.
Gavin

1
CentOS 5.8 및 MySQL v 14.14 Distrib 5.1.71에서 기본값을 TEXT 필드로 설정하려고하면 경고 대신 오류가 발생합니다. 모든 Linux 플랫폼에서 작동하지는 않습니다.
Alex

요즘 OS X는 오류가 발생하지 않는 것 같습니다. 문서 dev.mysql.com/doc/refman/5.7/en/blob.html 은 "BLOB 및 TEXT 열은 DEFAULT 값을 가질 수 없습니다"라고 말합니다. FWIW (그러나 이유는 아님)
rogerdpack

31

mySQL 엔진에 대한 깊은 지식이 없으면 메모리 절약 전략처럼 들립니다. 나는 그 이유가 문서 에서이 단락 뒤에 있다고 가정합니다 .

각 BLOB 또는 TEXT 값은 내부적으로 별도로 할당 된 객체로 표시됩니다. 이는 테이블을 열 때 열당 한 번 스토리지가 할당되는 다른 모든 데이터 유형과 대조됩니다.

이러한 열 유형을 미리 채우면 메모리 사용 및 성능 저하가 발생할 수 있습니다.


5
-1 : 도시 이름과 같은 데이터를 TEXT 열에 저장하면 동일한 데이터를 CHAR 또는 VARCHAR 열에 저장하는 것보다 실제로 총 메모리가 덜 사용됩니다.
David Cary

5
@ david 인용 한 매뉴얼 장은 저장 공간이 아니라 검색입니다.
Pekka

1
어떻게 메모리가 비정상적으로 사용되거나 성능이 저하되는지 알 수 없습니다. 분명히 사용자가 기본값을 정의하면 데이터 유형이 무엇이든 (특히 대량 작업에서) 성능이 저하 될 것으로 예상합니다. 그러나 BLOB / TEXT 필드의 경우이 성능 히트가 다른 데이터 유형에 비해 상대적으로 높다는 것을 이해하는 한? 그리고 BLOB / TEXT가 내부적으로 분리 된 객체로 저장된다는 사실과 어떻게 관련이 있습니까? 이것은 나에게 이해가되지 않습니다.
괴물

27
IMHO 메모리 절약 전략이 아닙니다. 그것은 버그이거나 그것을 쓴 사람들은 미쳤다. 그리고 나는 그것이 적어도 8 년 동안 그것을 고칠 수 없기 때문에 후자라고 생각합니다. 다른 모든 데이터베이스의 기본 기능.
괴물

2
중요하지 않지만, 여전히 그것을 사용하려는 사람들에게는 옵션이어야합니다.
jurchiks

15

트리거를 사용하여 기본값과 동일한 효과를 얻을 수 있습니다

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 ;

14

주요 질문으로 :

왜 이것이 허용되지 않는지 아십니까?

여전히 답을 얻지 못했지만 빠른 검색을 수행하고 MySQL Bugs 의 MySQL 개발자가 비교적 새로 추가 한 것을 발견했습니다 .

[2017.03.17 15:11] Ståle Deraas

개발자가 게시 :

이것은 실제로 유효한 기능 요청이며 언뜻보기에는 추가하기가 쉽지 않을 수 있습니다. 그러나 TEXT / BLOBS 값은 테이블 읽기 / 업데이트에 사용되는 레코드 버퍼에 직접 저장되지 않습니다. 따라서 기본값을 할당하는 것이 조금 더 복잡합니다.

이것은 명확한 답은 아니지만 적어도 질문에 대한 출발점 입니다.

그 사이에 코드를 작성하고 열을 nullable로 만들거나 응용 프로그램 코드에서 ''각각에 대해 (default ) 값을 명시 적으로 할당합니다 insert.


13

"TEXT / BLOB 열의 DEFAULT 지원"은 MySQL Bugtracker (버그 # 21532)기능 요청입니다 .

TEXT 열에 기본값을 설정하려는 유일한 사람이 아닙니다. 이 기능은 이후 버전의 MySQL에서 지원되어야한다고 생각합니다.

이 기능을 지원하지 않는 (현재) 데이터베이스와 지원하는 데이터베이스 사이에서 데이터베이스를 앞뒤로 전송하려는 경우 비 호환성 및 데이터 손실이 발생할 수 있으므로 MySQL 버전 5.0에서는이 문제를 해결할 수 없습니다. 그 기능.


null을 허용하는 TEXT 열의 경우 ""와 NULL 사이에서 변경할 수 있어야합니다. 할 수없는 것 같습니다.
phpguru

6

나는 일반적으로 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');

그게 다야.


1
이것은 왜 MySQL이 동작을하는지에 대한 질문을 다루지는 않지만 다른 사람들도 혜택을 볼 수 있도록 접근 방식을 공유해 주셔서 감사합니다. 스택 오버플로에 오신 것을 환영합니다!
GargantuChet

1
나중에 알아요 ... MySQL이 Nix의 상자에 경고를 던지지 만 Windows 상자에는 실패하기 때문에 STRICT 모드를 자세히 살펴 봐야합니다. 이는 플랫폼에 관계없이 구현에 문제가있을 수 있음을 나타냅니다. MySQL의 문서에는 "BLOB 및 TEXT 열은 DEFAULT 값을 가질 수 없습니다."라는 통지가 있습니다. 따라서 논리적으로 5 이전 버전의 구현은 실제로 모든 플랫폼에서 중단 된 것으로 보입니다.
Darrell Greenhouse

3

우분투 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'

문제가 해결되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.