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 ;
"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');
그게 다야.
주요 질문으로 :
왜 이것이 허용되지 않는지 아십니까?
is still not answered, I did a quick search and found a relatively new addition from a MySQL developer at MySQL Bugs:
[17 Mar 2017 15:11] Ståle Deraas
Posted by developer:
This is indeed a valid feature request, and at first glance it might seem trivial to add. But TEXT/BLOBS values are not stored directly in the record buffer used for reading/updating tables. So it is a bit more complex to assign default values for them.
This is no definite answer, but at least a starting point for the why question.
In the mean time, I'll just code around it and either make the column nullable or explicitly assign a (default ''
) value for each insert
from the application code...
For Ubuntu 16.04:
How to disable strict mode in MySQL 5.7:
Edit file /etc/mysql/mysql.conf.d/mysqld.cnf
If below line exists in mysql.cnf
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
Then Replace it with
sql_mode='MYSQL40'
Otherwise
Just add below line in mysqld.cnf
sql_mode='MYSQL40'
This resolved problem.
참고URL : https://stackoverflow.com/questions/3466872/why-cant-a-text-column-have-a-default-value-in-mysql
'Programing' 카테고리의 다른 글
GPL v2와 GPL v3 라이센스의 차이점은 무엇입니까? (0) | 2020.06.02 |
---|---|
사용자 제어 라이브러리와 사용자 정의 제어 라이브러리의 차이점은 무엇입니까? (0) | 2020.06.02 |
람다 식은 실행될 때마다 힙에 객체를 생성합니까? (0) | 2020.06.02 |
IntelliJ에서 컴파일 오류 목록을 보는 방법은 무엇입니까? (0) | 2020.06.02 |
Haskell의 멀티 코어 프로그래밍 상태는 무엇입니까? (0) | 2020.06.02 |