programing

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

nicescript 2022. 9. 21. 22:18
반응형

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

테이블에 TEXT 열을 만들고 MySQL에서 기본값을 지정하려고 하면 오류가 발생합니다(적어도 윈도우즈에서).텍스트 열에 기본값이 없어야 하는 이유를 알 수 없습니다.MySQL 문서에는 설명이 없습니다.비논리적인 것 같습니다(디폴트값을 원하기 때문에 다소 답답합니다!).이게 왜 안 되는지 아는 사람?

윈도우즈 MySQL v5에서 오류가 발생하지만 Linux 및 기타 버전에서는 경고만 발생합니다.고쳐야 돼 WTF?

MySQL Bugtracker에서 버그 #19498로 수정 시도도 참조하십시오.

브라이스 네스빗 2008년 4월 4일 오후 4시 36분:
MS Windows 에서는, 「No DEFAULT」규칙은 에러입니다만, 그 외의 플랫폼에서는 경고인 경우가 많습니다.버그는 아니지만, 관대한 플랫폼에서 코드를 작성하고 나중에 엄격한 플랫폼에서 실행하면 이 문제에 휘말릴 수 있습니다.

개인적으로, 저는 이것을 버그로 봅니다."BLOB/TEXT column can't have default value"를 검색하면 Google에서 약 2,940개의 결과가 반환됩니다.이들 대부분은 한 시스템에서 작동하지만 다른 시스템에서는 작동하지 않는 DB 스크립트를 설치하려고 할 때 비호환성에 대한 보고서입니다.

원래 Linux MySQL v5.0.83-log에 배포된 클라이언트 중 하나를 위해 수정 중인 웹 앱에서도 동일한 문제가 발생했습니다.Windows MySQL v5.1.41을 실행하고 있습니다.최신 버전의 phpMyAdmin을 사용하여 데이터베이스를 추출하려고 해도 해당 텍스트 열의 기본값을 보고하지 않습니다.다만, Windows 로 인서트를 실행하려고 하면(Linux 전개에서는 정상적으로 동작한다), ABC 컬럼에 no default 라고 하는 에러가 표시됩니다.명백한 기본값을 사용하여 테이블을 로컬로 다시 작성하려고 하면(그 열에 대한 고유한 값을 선택하여), 결과적으로 매우 유용한 BLOB/TEXT 열이 기본값을 가질없습니다.

플랫폼 간에 기본적인 호환성을 유지하지 않는 것은 받아들일 수 없으며 버그입니다.


MySQL 5(Windows)에서 strict 모드를 비활성화하는 방법:

  • /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
    

root/admin 액세스 권한이 있는 경우 실행할 수 있습니다.

mysql_query("SET @@global.sql_mode='MYSQL40'");

mySQL 엔진에 대한 깊은 지식이 없다면 메모리 절약 전략으로 들릴 것입니다. 문서의 이 단락 뒤에 이유가 있을 것입니다.

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

이러한 유형의 열을 미리 채우면 메모리 사용량 및 성능 저하로 이어질 수 있습니다.

주요 질문으로서:

이게 왜 안 되는지 아는 사람?

아직 답변이 없습니다.빠른 검색을 해보니 MySQL Bugs에서 비교적 새로운 MySQL 개발자가 추가했습니다.

[2017년 3월 17일 15:11]스톨레 데라아스

개발자가 게시:

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

이것은 확답은 아니지만, 적어도 그 이유에 대한 질문의 출발점은 된다.

그 사이에, 그 주위를 코드화해, 열을 무효로 하거나, 명시적으로 할당합니다(디폴트).'')의 값insert어플리케이션 코드에서...

"텍스트/BLOB 컬럼의 디폴트 지원"은 MySQL Bugtracker(버그 번호 21532)의 기능 요청입니다.

TEXT 열에 기본값을 입력하는 것은 저뿐만이 아닙니다.이 기능은 이후 버전의 MySQL에서 지원되어야 한다고 생각합니다.

이는 MySQL 버전 5.0에서는 수정할 수 없습니다. 왜냐하면 누군가가 해당 기능을 지원하지 않는 (현재) 데이터베이스와 해당 기능을 지원하는 데이터베이스 간에 데이터베이스를 전송하려고 하면 비호환성과 데이터 로스가 발생하기 때문입니다.

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

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 ;

저는 보통 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');

이상입니다.

Ubuntu 16.04의 경우:

MySQL 5.7에서 strict 모드를 비활성화하는 방법:

/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'

이 문제는 해결되었습니다.

표현식을 기본값으로 사용할 수 있는 지원이 MySQL 8.0.13에 추가되어 2018-10-22가 출시되었으며 다음에서 작동합니다.TEXT,JSON,BLOB그리고.GEOMETRY.

아직 쓸 수 없습니다.

create table foo(bar text default 'baz')

그러나 이제 다음과 같이 쓸 수 있습니다.

create table foo(bar text default ('baz'))

같은 일을 해내죠

이것은 매우 오래된 질문이지만 여전히 제대로 답하지 못한 것 같다.그리고 이 답변은 "왜 텍스트 열에 기본값을 설정할 수 없는가?"라는 질문에 대한 실제 답변은 아니지만, 긴 텍스트를 댓글로 작성하는 것은 불가능하며, 제 코멘트가 오류를 방지하는 데 도움이 될 수 있으므로, 다음은 별도의 답변입니다.

OS - Windows-Linux 때문에 오류가 발생하고 있다고 하는 사람도 있습니다만, 이것은 OS와 직접 관련이 있는 것은 아닙니다.(다만, OS에 따라 인스톨러에 따라 MySQL의 디폴트 설정에 차이가 있을 수 있습니다.)

주된 이유는 깃발이다.STRICT_TRANS_TABLES위해서sql_modesetting. 에 값이 지정되지 않은 경우INSERT에 대한 진술.TEXTdatatype 컬럼과 플래그가 존재하는 경우sql_mode설정을 하면 MySQL이 오류를 보고하고 플래그가 존재하지 않으면 MySQL은 경고만 보고하고 레코드를 삽입합니다.

따라서 이 오류를 방지하기 위해 이 오류를 제거할 수 있습니다.STRICT_TRANS_TABLES부터sql_modeMySQL 설정(데이터베이스의 다른 조작에 영향을 줄 가능성이 있는 경우는, 모드를 이전 값으로 리셋 할 필요가 있습니다).

MySQL의 SQL 모드 설명서에 따르면...

위해서STRICT_TRANS_TABLESMySQL은 유효하지 않은 값을 컬럼의 가장 가까운 유효값으로 변환하고 조정된 값을 삽입합니다.값이 누락된 경우 MySQL은 열 데이터 유형에 대한 암시적 기본값을 삽입합니다.두 경우 모두 MySQL은 오류가 아닌 경고를 생성하고 계속 문을 처리합니다.암묵적 기본값은 섹션 11.6 "데이터 유형 기본값"에 설명되어 있습니다.

...및 데이터 타입의 디폴트값 문서...

BLOB,TEXT,GEOMETRY,그리고.JSON데이터 유형에는 기본값을 할당할 수 없습니다.

...TEXT열은 기본값을 가질 수 없습니다.STRICT_TRANS_TABLES에서 삭제되다sql_mode그러면 MySQL은 빈 문자열을 삽입합니다.''값이 지정되지 않은 경우TEXT에 기고하다.INSERT진술.

언급URL : https://stackoverflow.com/questions/3466872/why-cant-a-text-column-have-a-default-value-in-mysql

반응형