장고 차 필드 vs 텍스트 필드


302

장고 CharField()와 의 차이점은 무엇입니까 TextField()? 문서는 것을 말한다 CharField()작은 문자열을 사용해야하며 TextField()더 큰 문자열을 사용해야합니다. 좋아,하지만 "작은"과 "큰"사이의 선은 어디에 있습니까? 이 사건을 일으킨 사건은 무엇입니까?

답변:


354

RDBMS varchar(또는 이와 유사한) 의 차이점 은 일반적으로 최대 길이로 지정되며 성능 또는 스토리지 측면에서 더 효율적일 수 있으며 text(또는 유사한) 유형은 일반적으로 하드 코딩 된 구현 제한에 의해서만 제한됩니다 ( DB 스키마).

PostgreSQL 9는 특히 "이 세 가지 유형 사이에는 성능 차이가 없습니다"라고 말하지만 AFAIK에는 MySQL과 같은 몇 가지 차이점이 있으므로 명심해야합니다.

경험 상으로는 CharField최대 길이를 제한해야 할 때 사용하는 것이 좋습니다 TextField.

이것은 실제로 장고에 한정되지 않습니다.


43
반대로, CharField를 사용한다면 최대 길이 를 가져야합니다
Sam Svenbjorgchristiensensen

17
TextField기본적으로 사용 하면 앱의 이식성에 영향을 줄 수 있습니다. Postgres에는 성능 저하가 없을 수 있지만 Oracle은 CLOBWHERE 문에서 필드를 사용할 수없는 것과 같이 약간의 성가신 것으로 저장합니다 . 고려해야 할 것.
Rob

3
또한 Oracle에서 2000보다 클 CharField수 없거나 오류가 발생 한다는 점도 고려해야합니다 . max_lengthORA-00910: specified length too long for its datatype
Dinei

필드 속성을 고려할 때 Postgres 문서 에서도 다음과 같이 말합니다 . "저장할 수있는 가장 긴 문자열은 약 1GB입니다. (데이터 유형 선언에서 n에 허용되는 최대 값은 보다 작음 [...] 특정 상한없이 긴 문자열을 저장 하려면 임의의 길이 제한을 구성하는 대신 길이 지정자가없는 텍스트 또는 문자를 사용하십시오 .) "
iff_or

3
장고에서 두 가지의 중요한 차이점은 시야가 필드를 처리하는 방법입니다. 일반 편집보기에서 TextField는 여러 줄 크기 조정 가능 입력으로 렌더링됩니다. CharField는 단일 라인 입력입니다. TextField의 django 소스를 보지 않았지만 생성 된 html이 TextField에 첨부되어 있다고 가정하면 여러 줄 텍스트를 올바르게 조작하는 방법을 구현할 것입니다.
Mitchell Walls

36

어떤 경우에는 필드가 사용되는 방식과 관련이 있습니다. 일부 DB 엔진에서 필드 차이에 따라 필드에서 텍스트를 검색하는 방법 (및 경우)이 결정됩니다. CharFields는 일반적으로 문자열 "one plus two"에서 "one"을 검색하려는 경우와 같이 검색 가능한 항목에 사용됩니다. 문자열이 짧기 때문에 엔진을 검색하는 데 시간이 덜 걸립니다. 텍스트 필드는 일반적으로 검색 (예 : 블로그 본문)을 통해 검색되는 것이 아니라 많은 양의 텍스트를 포함하도록되어 있습니다. 이제 대부분이 DB 엔진에 의존하며 Postgres와 마찬가지로 중요하지 않습니다.

중요하지 않더라도 ModelForms를 사용하면 양식에 다른 유형의 편집 필드가 나타납니다. ModelForm은 CharField의 경우 한 줄의 텍스트와 TextField의 여러 줄 크기의 HTML 양식을 생성합니다.


2
이것은 필드를 양식으로 생성하는 방법을 언급하기 때문에 가장 좋은 설명입니다. Charfield는 한 줄로 입력되지만 TextField는 크기 조정이 가능한 여러 줄이됩니다. TextField는 주로 일반 클래스 뷰를 구현할 때 의미가 있습니다. 설명 필드 등에 적합합니다. 또한 renderbox가 필터 / 검색에 사용하고 싶지 않다고 언급 한 방법이 좋습니다.
Mitchell Walls

8

예를 들어. 다음과 같은 모델에 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;

1
nit : Django 문서 권장 Avoid using null on string-based fields such as CharField and TextField:: docs.djangoproject.com/en/2.0/ref/models/fields/#null 을 유지하는 것이 가장 좋습니다 null=False.
modulitos

7

CharField최대 255문자 수인 반면 TextField최대 255자 수를 초과 할 수 있습니다 . TextField입력으로 큰 문자열이있는 경우 사용하십시오 . max_length매개 변수가 전달 될 때 TextField길이 유효성 검증을 TextArea위젯에 전달 한다는 것을 아는 것이 좋습니다 .


"필드에 unique = True를 사용하는 경우VARCHAR 열 유형 으로 저장된 모든 필드는 max_length255 자로 제한됩니다 . "(내 강조)
l0b0

-4

이상한 문제가 있었고 불쾌한 이상한 차이점을 이해했습니다 .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에 정확히 동일하게 저장된다는 것을 언급해야 하지만 클릭 할 때 결과가 다른 이유를 모르겠습니다.

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