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_mode
setting. 에 값이 지정되지 않은 경우INSERT
에 대한 진술.TEXT
datatype 컬럼과 플래그가 존재하는 경우sql_mode
설정을 하면 MySQL이 오류를 보고하고 플래그가 존재하지 않으면 MySQL은 경고만 보고하고 레코드를 삽입합니다.
따라서 이 오류를 방지하기 위해 이 오류를 제거할 수 있습니다.STRICT_TRANS_TABLES
부터sql_mode
MySQL 설정(데이터베이스의 다른 조작에 영향을 줄 가능성이 있는 경우는, 모드를 이전 값으로 리셋 할 필요가 있습니다).
위해서
STRICT_TRANS_TABLES
MySQL은 유효하지 않은 값을 컬럼의 가장 가까운 유효값으로 변환하고 조정된 값을 삽입합니다.값이 누락된 경우 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
'programing' 카테고리의 다른 글
동적으로 PHP과 QR코드 생성. (0) | 2022.09.21 |
---|---|
JWT를 ReactJs와 함께 localStorage에 저장해도 안전합니까? (0) | 2022.09.21 |
Node.js에서 Sequelize를 사용하여 조인 쿼리를 만드는 방법 (0) | 2022.09.21 |
vue DevTools가 vuex 돌연변이를 자동으로 커밋하도록 하려면 어떻게 해야 합니까? (0) | 2022.08.23 |
Vue.js - ve-validate를 사용하기 위해 v-를 사용하여 사용자 지정 단일 파일 구성 요소를 제대로 검증할 수 없음 (0) | 2022.08.23 |