답변:
RDBMS varchar
(또는 이와 유사한) 의 차이점 은 일반적으로 최대 길이로 지정되며 성능 또는 스토리지 측면에서 더 효율적일 수 있으며 text
(또는 유사한) 유형은 일반적으로 하드 코딩 된 구현 제한에 의해서만 제한됩니다 ( DB 스키마).
PostgreSQL 9는 특히 "이 세 가지 유형 사이에는 성능 차이가 없습니다"라고 말하지만 AFAIK에는 MySQL과 같은 몇 가지 차이점이 있으므로 명심해야합니다.
경험 상으로는 CharField
최대 길이를 제한해야 할 때 사용하는 것이 좋습니다 TextField
.
이것은 실제로 장고에 한정되지 않습니다.
TextField
기본적으로 사용 하면 앱의 이식성에 영향을 줄 수 있습니다. Postgres에는 성능 저하가 없을 수 있지만 Oracle은 CLOB
WHERE 문에서 필드를 사용할 수없는 것과 같이 약간의 성가신 것으로 저장합니다 . 고려해야 할 것.
CharField
수 없거나 오류가 발생 한다는 점도 고려해야합니다 . max_length
ORA-00910: specified length too long for its datatype
어떤 경우에는 필드가 사용되는 방식과 관련이 있습니다. 일부 DB 엔진에서 필드 차이에 따라 필드에서 텍스트를 검색하는 방법 (및 경우)이 결정됩니다. CharFields는 일반적으로 문자열 "one plus two"에서 "one"을 검색하려는 경우와 같이 검색 가능한 항목에 사용됩니다. 문자열이 짧기 때문에 엔진을 검색하는 데 시간이 덜 걸립니다. 텍스트 필드는 일반적으로 검색 (예 : 블로그 본문)을 통해 검색되는 것이 아니라 많은 양의 텍스트를 포함하도록되어 있습니다. 이제 대부분이 DB 엔진에 의존하며 Postgres와 마찬가지로 중요하지 않습니다.
중요하지 않더라도 ModelForms를 사용하면 양식에 다른 유형의 편집 필드가 나타납니다. ModelForm은 CharField의 경우 한 줄의 텍스트와 TextField의 여러 줄 크기의 HTML 양식을 생성합니다.
예를 들어. 다음과 같은 모델에 2 개의 필드가 추가됩니다.
description = models.TextField(blank=True, null=True)
title = models.CharField(max_length=64, blank=True, null=True)
다음은 마이그레이션이 적용될 때 실행되는 mysql 쿼리입니다.
위한 TextField
(설명) 필드가 정의되고longtext
ALTER TABLE `sometable_sometable` ADD COLUMN `description` longtext NULL;
string-type-overviewTextField
에 따르면 MySQL 의 최대 길이 는 4GB 입니다.
위한 CharField
(제목)를 MAX_LENGTH (필수)로 정의varchar(64)
ALTER TABLE `sometable_sometable` ADD COLUMN `title` varchar(64) NULL;
ALTER TABLE `sometable_sometable` ALTER COLUMN `title` DROP DEFAULT;
Avoid using null on string-based fields such as CharField and TextField
:: docs.djangoproject.com/en/2.0/ref/models/fields/#null 을 유지하는 것이 가장 좋습니다 null=False
.
이상한 문제가 있었고 불쾌한 이상한 차이점을 이해했습니다 .CharField 로 사용자로부터 URL을 얻은 다음 href로 태그를 HTML에 사용하면 해당 URL이 내 URL에 추가 되고 원하는 것이 아닙니다. 그러나 텍스트 필드로 수행하면 사용자가 입력 한 URL 만 전달 합니다. 이것들을보십시오 : 내 웹 사이트 주소 :http://myweb.com
CharField entery : http://some-address.com
그것을 클릭 할 때 : http://myweb.comhttp://some-address.com
텍스트 입력란 : http://some-address.com
그것을 클릭 할 때 : http://some-address.com
URL이 두 가지 방법으로 DB에 정확히 동일하게 저장된다는 것을 언급해야 하지만 클릭 할 때 결과가 다른 이유를 모르겠습니다.