Django CharField กับ TextField


302

ความแตกต่างระหว่างCharField()และTextField()ใน Django คืออะไร? เอกสารบอกว่าCharField()ควรจะใช้สำหรับสายขนาดเล็กและTextField()ควรจะใช้สำหรับสายที่มีขนาดใหญ่ โอเค แต่เส้นที่ลากระหว่าง "เล็ก" และ "ใหญ่" อยู่ที่ไหน เกิดอะไรขึ้นภายใต้ประทุนที่นี่ที่ทำให้กรณีนี้?

คำตอบ:


354

เป็นความแตกต่างระหว่าง RDBMS's varchar(หรือคล้ายกัน) - โดยทั่วไปแล้วจะถูกระบุด้วยความยาวสูงสุดและอาจมีประสิทธิภาพมากกว่าในแง่ของประสิทธิภาพหรือการจัดเก็บ - และtext(หรือที่คล้ายกัน) ประเภท - ซึ่งโดยทั่วไปแล้วจะถูก จำกัด ด้วย DB schema)

PostgreSQL 9 ระบุว่า"ไม่มีความแตกต่างด้านประสิทธิภาพระหว่างสามประเภทนี้"แต่ AFAIK มีความแตกต่างบางอย่างเช่น MySQL ดังนั้นนี่จึงเป็นสิ่งที่คุณควรคำนึงถึง

กฎง่ายๆคือคุณใช้CharFieldเมื่อคุณต้องการจำกัดความยาวสูงสุดTextFieldมิฉะนั้น

นี่ไม่ใช่เฉพาะของ Django ด้วย


43
และในทางกลับกันถ้าคุณใช้ CharField คุณต้องมีความยาวสูงสุด
Sam Svenbjorgchristiensensen

17
ฉันพบว่าการใช้TextFieldโดยค่าเริ่มต้นอาจส่งผลกระทบต่อการพกพาของแอพของคุณ อาจไม่มีประสิทธิภาพในการใช้งาน Postgres แต่ Oracle จะเก็บข้อมูลดังกล่าวCLOBซึ่งมีความรำคาญบางอย่างเช่นไม่สามารถใช้ฟิลด์ในคำสั่ง WHERE ได้ สิ่งที่ต้องพิจารณา
Rob

3
หนึ่งควรพิจารณาว่าใน Oracle CharFieldไม่สามารถมีmax_lengthมากกว่า 2000 หรือปัญหาORA-00910: specified length too long for its datatypeข้อผิดพลาด
Dinei

มีประโยชน์ที่ควรทราบเมื่อพิจารณาคุณลักษณะของเขตข้อมูลนั้นเอกสาร Postgres ยังพูดว่า (การเน้นที่สำคัญ): "สตริงอักขระที่ยาวที่สุดที่สามารถเก็บได้คือประมาณ 1 GB (ค่าสูงสุดที่จะอนุญาตสำหรับ n ในการประกาศชนิดข้อมูลคือ น้อยกว่านั้น [... ] หากคุณต้องการจัดเก็บสายยาวโดยไม่มีข้อ จำกัด ด้านบนให้ใช้ข้อความหรือตัวอักษรที่แตกต่างกันโดยไม่มีตัวระบุความยาวแทนที่จะใช้ขีดจำกัดความยาวตามอำเภอใจ ) "
iff_or

3
ฉันเชื่อว่าความแตกต่างที่สำคัญจริงๆระหว่างสองใน django คือมุมมองจะจัดการกับฟิลด์อย่างไร ในมุมมองการแก้ไขทั่วไป TextField จะแสดงผลเป็นอินพุตที่ปรับขนาดได้หลายบรรทัด ในขณะที่ CharField เป็นอินพุตบรรทัดเดียว ฉันไม่ได้ดูแหล่งข้อมูล django สำหรับ TextField แต่ฉันจะสมมติว่า html ที่สร้างขึ้นใด ๆ ถูกแนบไปกับ TextField แล้วมันน่าจะใช้วิธีจัดการกับข้อความหลายบรรทัดอย่างเหมาะสม
Mitchell Walls

36

ในบางกรณีมันจะเชื่อมโยงกับวิธีการใช้สนาม ในเอ็นจิ้น DB บางตัวความแตกต่างของฟิลด์กำหนดว่า (และถ้า) คุณค้นหาข้อความในฟิลด์ได้อย่างไร โดยทั่วไป CharFields จะใช้สำหรับสิ่งที่สามารถค้นหาได้เช่นถ้าคุณต้องการค้นหา "หนึ่ง" ในสตริง "หนึ่งบวกสอง" เนื่องจากสตริงสั้นลงจึงใช้เวลาน้อยลงในการค้นหาเอ็นจิน โดยทั่วไป TextFields ไม่ได้หมายถึงการค้นหาผ่าน (เช่นเนื้อหาของบล็อก) แต่มีไว้เพื่อเก็บข้อความจำนวนมาก ตอนนี้ส่วนใหญ่ขึ้นอยู่กับ DB Engine และเช่นเดียวกับใน Postgres มันไม่สำคัญ

แม้ว่ามันจะไม่สำคัญถ้าคุณใช้ ModelForms คุณจะได้รับฟิลด์การแก้ไขประเภทต่าง ๆ ในแบบฟอร์ม ModelForm จะสร้างรูปแบบ HTML ขนาดหนึ่งบรรทัดของข้อความสำหรับ CharField และหลายบรรทัดสำหรับ TextField


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;

ความยาวสูงสุดของTextFieldของ 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
จู้จี้: เอกสาร Django แนะนำ: Avoid using null on string-based fields such as CharField and TextField: docs.djangoproject.com/en/2.0/ref/models/fields/#nullnull=Falseจึงดีที่สุดเพื่อให้
modulitos

7

CharFieldมี max_length ของ255ตัวอักษรในขณะที่TextFieldสามารถเก็บได้มากกว่า255ตัวอักษร ใช้TextFieldเมื่อคุณมีสตริงขนาดใหญ่เป็นอินพุต เป็นการดีที่จะรู้ว่าเมื่อmax_lengthพารามิเตอร์ถูกส่งผ่านไปยังTextFieldมันจะผ่านการตรวจสอบความยาวไปยังTextAreaวิดเจ็ต


"เขตข้อมูลใด ๆ ที่เก็บไว้กับVARCHARประเภทคอลัมน์มีความยาวไม่เกินmax_length255 อักขระหากคุณใช้งานซ้ำ = True สำหรับฟิลด์ " (ความสำคัญของฉัน)
l0b0

-4

ฉันมีปัญหาแปลก ๆ และเข้าใจถึงความแตกต่างที่แปลกประหลาด: เมื่อฉันได้รับ URL จากผู้ใช้ในฐานะCharFieldจากนั้นและใช้มันในแท็ก html โดย href มันเพิ่ม url นั้นใน url ของฉันและนั่นไม่ใช่สิ่งที่ฉันต้องการ แต่เมื่อฉันทำโดยTextfieldมันจะส่งผ่านเฉพาะ 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 ด้วยสองวิธี แต่ฉันไม่รู้ว่าทำไมผลลัพธ์จึงแตกต่างกันเมื่อคลิกที่ URL

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.