Django CharField ve TextField karşılaştırması


302

CharField()Ve TextField()Django arasındaki fark nedir ? Dokümantasyon söylüyor CharField()küçük dizeleri kullanılmalı ve TextField()daha büyük dizeleri kullanılmalıdır. Tamam, ama "küçük" ve "büyük" arasındaki çizgi nerede? Kaputun altında bunu yapan şey nedir?

Yanıtlar:


354

RDBMS'ler varchar(veya benzerleri) arasındaki farktır - bunlar genellikle maksimum uzunlukla belirtilir ve performans veya depolama açısından daha verimli olabilir - ve text(veya benzer) türleri - genellikle yalnızca sabit kodlanmış uygulama sınırları ( DB şeması).

PostgreSQL 9, özellikle, "Bu üç tip arasında performans farkı yok" diye belirtiyor , ancak AFAIK, örneğin MySQL'de bazı farklılıklar var, bu yüzden akılda tutulması gereken bir şey var.

İyi bir kural CharField, maksimum uzunluğu sınırlamanız gerektiğinde kullanmanızdır , TextFieldaksi takdirde.

Bu da Django'ya özgü değil.


43
Ve tersine, eğer CharField kullanıyorsanız o zaman maksimum uzunluğa sahip olmalısınız
Sam Svenbjorgchristiensensen

17
TextFieldVarsayılan olarak kullanmanın uygulamanızın taşınabilirliğini etkileyebileceğini fark ettim . Postgres'te bir performans isabeti olmayabilir, ancak Oracle bunu CLOBalanı WHERE ifadelerinde kullanamamak gibi bazı sıkıntılara sahip olarak saklayacaktır . Dikkate alınması gereken bir şey.
Rob

3
Bir de Oracle'da düşünmelisiniz CharFieldolamaz max_length2000 büyükse ya da bir sorunları ORA-00910: specified length too long for its datatypehatası.
Dinei

Alan öznitelikleri göz önüne alındığında, Postgres belgelerinin aynı zamanda (benimkini vurgulayan) şunu da not etmekte fayda var : "saklanabilecek olası en uzun karakter dizisi yaklaşık 1 GB'dir. (Veri türü bildiriminde n için izin verilecek maksimum değer bundan daha az [...] Belirli bir üst sınırı olmayan uzun dizeleri saklamak istiyorsanız , rastgele uzunluk sınırı oluşturmak yerine uzunluk belirteci olmadan değişen metin veya karakter kullanın .) "
iff_veya

3
Django'daki ikisi arasındaki gerçekten önemli farkın, bir görüşün alanı nasıl ele alacağı olduğuna inanıyorum. Genel bir düzenleme görünümünde TextField çok satırlı yeniden boyutlandırılabilir bir giriş olarak oluşturulur; CharField ise tek satırlık bir giriştir. TextField için django kaynağına bakmadım, ancak herhangi bir oluşturulan html bir TextField'a bağlıysa, o zaman büyük olasılıkla çok satırlı metni işlemek için bir yol uygulayacağını varsayacağım.
Mitchell Walls

36

Bazı durumlarda, alanın nasıl kullanıldığına bağlıdır. Bazı DB motorlarında alan farklılıkları, alandaki metni nasıl (ve eğer) arayacağınızı belirler. CharField'ler genellikle "bir artı iki" dizesinde "bir" aramak isterseniz, aranabilir şeyler için kullanılır. Dizeler daha kısa olduğu için motorun arama yapması daha az zaman alır. TextField öğelerinin genellikle aranması (bir blogun gövdesi gibi) değil, büyük metin yığınlarının tutulması amaçlanmıştır. Şimdi bu çoğu DB Motor bağlıdır ve Postgres gibi önemli değil.

Önemli olmasa bile, ModelForms'u kullanırsanız formda farklı bir düzenleme alanı elde edersiniz. ModelForm, CharField için bir metin satırı ve TextField için çok satırlı bir HTML formu oluşturur.


2
Bu, en iyi açıklamadır, çünkü alanı bir formda nasıl oluşturduğundan bahseder. Charfield yalnızca tek satırlık bir giriş olacaktır, ancak TextField yeniden boyutlandırılabilir bir çok satırlı olacaktır. TextField öncelikle genel sınıf görünümleri uyguladığınızda mantıklıdır. Bir açıklama alanı veya benzeri için harika çalışır. Ayrıca, renderbox'ın herhangi bir filtre / arama için kullanmak istemediğinizden nasıl bahsettiğini seviyorum.
Mitchell Walls

8

Örneğin,. Aşağıdaki gibi bir modele 2 alan eklenmiştir.

description = models.TextField(blank=True, null=True)
title = models.CharField(max_length=64, blank=True, null=True)

Taşıma işlemleri uygulandığında yürütülen mysql sorguları aşağıdadır.


için TextField(bilgi) alanı a olarak tanımlanırlongtext

ALTER TABLE `sometable_sometable` ADD COLUMN `description` longtext NULL;

TextFieldMySQL'in maksimum uzunluğu dize türüne genel bakışa göre 4 GB'dir .


için CharField(başlık) MAX_LENGTH (gerekli) gibi tanımlanmıştırvarchar(64)

ALTER TABLE `sometable_sometable` ADD COLUMN `title` varchar(64) NULL;
ALTER TABLE `sometable_sometable` ALTER COLUMN `title` DROP DEFAULT;

1
nit: Django belgeleri şunları önerir Avoid using null on string-based fields such as CharField and TextField:: docs.djangoproject.com/en/2.0/ref/models/fields/#null bu yüzden saklamak en iyisidir null=False.
modulitos

7

CharFieldmaksimum 255karakter uzunluğuna sahipken TextField, 255karakterlerden daha fazlasını tutabilir . TextFieldGiriş olarak büyük bir dizeniz olduğunda kullanın . max_lengthParametre bir içine geçirildiğinde TextField, uzunluk doğrulamasını TextAreawidget'a geçirdiğini bilmekte fayda vardır.


" Alan için unique = True kullanıyorsanız , VARCHARsütun türleriyle depolanan tüm alanların max_length255 karakterle sınırlı olması gerekir . " (Vurgu.)
l0b0

-4

Ben garip bir sorun vardı ve hoş olmayan garip bir fark anladım: Ben bir CharField olarak kullanıcıdan bir URL almak ve sonra html bir etiket href tarafından kullandığınızda, bu url benim url ekler ve ben istediğim bu değil. Ancak Textfield ile yaptığım zaman sadece kullanıcının girdiği URL'yi geçer . şuna bakın: web sitemin adresi:http://myweb.com

CharField entery: http://some-address.com

üzerine tıklarken: http://myweb.comhttp://some-address.com

TextField entery: http://some-address.com

üzerine tıklarken: http://some-address.com

URL'nin DB'de iki şekilde tamamen aynı şekilde kaydedildiğini belirtmeliyim, ancak üzerlerine tıklarken sonucun neden farklı olduğunu bilmiyorum

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.