มีเหตุผลใดที่จะใช้ varchar บนคอลัมน์ข้อความในฐานข้อมูลหรือไม่?


36

เป็นvarcharเพียงเศษเล็กเศษน้อยจากก่อนหน้าtextนี้มาหรือมีกรณีการใช้งานที่คุณต้องการใช้varchar? (หรือcharสำหรับเรื่องนั้น .. )

(ฉันใช้ Postgres และ MySQL (MyISAM) ทุกวันดังนั้นนี่คือสิ่งที่ฉันสนใจมากที่สุด แต่คำตอบสำหรับฐานข้อมูลอื่นนั้นยินดีต้อนรับแน่นอน ^ _-)


6
อย่างน้อยสำหรับSQL Server , textเลิก นอกจากนี้ยังมีข้อควรพิจารณาเกี่ยวกับการใช้งานที่เกี่ยวข้องกับการจัดเก็บข้อมูลและวิธีการเข้าถึงข้อมูล
Oded

ใน DBMS บางตัวคุณอาจไม่สามารถใช้คอลัมน์ข้อความในการเรียงลำดับหรือตำแหน่งใดก็ได้ ฉันไม่คุ้นเคยกับ Postgres แต่ตรวจสอบเอกสารของคุณ
jqa

1
คำถาม StackOverflow นี้อาจให้ข้อมูลเพิ่มเติม
J0ANMM

คำตอบ:


32

โดยทั่วไป

textคอลัมน์ไม่ได้มาตรฐานและมีการใช้งานเฉพาะ ในหลายกรณีขึ้นอยู่กับฐานข้อมูลที่พวกเขาอาจจะมีการรวมกันของหนึ่งหรือมากกว่าของข้อ จำกัด ต่อไปนี้: ไม่สามารถจัดทำดัชนี , ไม่สามารถค้นหาได้และไม่ได้จัดเรียง

ใน Postgres

ประเภททั้งหมดเหล่านี้จะถูกบันทึกไว้ภายในโดยใช้โครงสร้างข้อมูล C เดียวกัน .

ใน MySQL

textคอลัมน์เป็นรุ่นเฉพาะของBLOBและมีข้อ จำกัด ในการจัดทำดัชนี

เพียงสองตัวอย่างเท่านั้นที่สามารถคาดการณ์ถึงระบบ SQL RDBMS อื่นและควรมีเหตุผลเพียงพอที่จะเข้าใจเมื่อเลือกประเภทหนึ่งเหนืออีกประเภทหนึ่ง

เพียงเพื่อให้ชัดเจนโดยปริยายคุณไม่ควรใช้TEXTเนื่องจากเป็นกรรมสิทธิ์และไม่ได้มาตรฐาน สิ่งที่SQLคุณเขียนจะไม่สามารถพกพาได้และจะรับประกันว่าจะทำให้เกิดปัญหาในอนาคต ใช้ชนิดที่เป็นส่วนหนึ่งของมาตรฐาน ANSIเท่านั้น

  • ใช้CHARเมื่อคุณรู้ว่าคุณมีจำนวนอักขระที่แน่นอนสำหรับทุกรายการ
  • ใช้VARCHARเมื่อคุณมีจำนวนอักขระแปรผันสำหรับทุกรายการ
  • หากคุณต้องการพื้นที่เก็บข้อมูลมากกว่าที่VARCHARสามารถจัดให้ได้CLOBพร้อมการUTF-8เข้ารหัสหรือประเภทมาตรฐานที่เทียบเท่า
  • ไม่เคยใช้TEXTเพราะมันไม่ได้มาตรฐาน

1
เป็นที่ยอมรับnon standard and implementation specificและnot indexable, not searchable and not sortableซึ่งฉันก็ไม่รู้ ฉันอยู่ภายใต้ความประทับใจที่text ได้มาตรฐาน
Izkata

1
คุณหมายถึงtextมาตรฐานASCII หรือมาตรฐาน UNICODE text:-) หรือหนึ่งในtextมาตรฐานการเข้ารหัสอีกครึ่งโหล

1
หากคุณไปขุดเอกสารมาตรฐาน SQL ฉันไม่คิดว่าคุณจะพบอะไรtextเป็นตัวอักษรประเภท ฉันไม่เห็นอะไรเลยผู้ขายบางรายเรียกมันว่าlong charอย่างนั้นมันเป็น BLOB ที่มีการเข้ารหัสติดอยู่

2
@JarrodRoberson มีความซื่อสัตย์มีทรัพยากรที่มีชื่อเสียงมากมายที่สรุป (เมื่ออยู่ในสภาพแวดล้อมของ Postgres) ที่ "ใช้เสมอTEXT" หากคุณกำลังจะย้ายไปยังฐานข้อมูลที่แตกต่างกันที่แทบจะไม่ฝ่าฝืนข้อตกลงโดยเฉพาะอย่างยิ่งนับตั้งแต่ที่คุณจะต้องพิจารณาว่า postgres' ไม่ จำกัดVARCHAR(เนื่องจาก TOAST ไม่มีขีด จำกัด ของแถวอย่างเช่นกับ MySQL) อาจจะไม่แปลให้ได้ไม่ จำกัดVARCHARใน ฐานข้อมูลอื่น ๆ อยู่ดี
Kayaman

1
... และเนื่องจากPostgres ไม่รองรับ CLOBจุดที่สองถึงจุดสุดท้ายจะไม่ถือ คุณจะไม่สามารถรองรับการแทนที่แบบดรอปดาวน์ได้แม้ว่าจะเป็นไปตามมาตรฐานก็ตาม เช่นเดียวกับการเขียน ANSI SQL ไม่ใช่ตัวเลือกที่ใช้งานได้ในโลกแห่งความเป็นจริงเว้นแต่ว่าคุณกำลังเขียนของเล่น SQL
Kayaman

11

text, varcharและcharได้รับการใช้เหตุผลที่แตกต่างกัน แน่นอนว่ามีความแตกต่างในการใช้งาน (ขนาดเท่าไรครอบครอง .. ฯลฯ ) แต่ยังมีการพิจารณาการใช้งานและความตั้งใจ ประเภทที่คุณใช้จะบอกคุณบางอย่างเกี่ยวกับประเภทของข้อมูลที่จะถูกเก็บไว้ในนั้น (หรือเราทุกคนจะใช้textสำหรับทุกสิ่ง ) charหากสิ่งที่มีความยาวคงที่เราจะใช้ ถ้ามันมีความยาวตัวแปรที่มีขีด จำกัด varcharบนกำหนดไว้อย่างดีจากนั้นใช้ หากเป็นข้อความขนาดใหญ่ที่คุณสามารถควบคุมได้เพียงเล็กน้อยก็textน่าจะเป็นทางออกที่ดีที่สุดของคุณ


3
Sooooooo, ความแตกต่างที่แท้จริงเพียงอย่างเดียวคือการทำซ้ำการตรวจสอบขอบเขตที่ควรจะอยู่ในรหัสโปรแกรมหรือไม่?
Izkata

2
@Izkata - มีความแตกต่างในการใช้งานเช่นกัน มันไม่ได้เกี่ยวกับขอบเขตการตรวจสอบเกี่ยวกับข้อมูลประเภท รหัสไปรษณีย์ A (US) เป็นรหัส 5 หลักเสมอดังนั้นการใช้บางอย่างเช่น 'char' จึงกลายเป็นส่วนหนึ่งของคำจำกัดความของข้อมูลชิ้นนี้ หากมันเป็นเพียงแค่การตรวจสอบที่ถูกผูกไว้เราทุกคนสามารถใช้ประเภทข้อมูลเดียวสำหรับทุกสิ่งและทำการตรวจสอบและทำการหล่อโค้ด
ระบบดาวน์

6
@SystemDown เท่าที่ฉันรู้char, varcharและtextได้รับการออกแบบสำหรับการจัดเก็บเดียวกันประเภทของข้อมูล ดังนั้นคำตอบทั้งสองนี้เกี่ยวกับการตรวจสอบขอบเขต หากมีความแตกต่างของประสิทธิภาพพวกเขาคืออะไร ทำไมฉันต้องใช้varcharมากกว่าtext?
Izkata

1
float และ double ใช้สำหรับข้อมูลประเภทเดียวกัน แต่มีความแตกต่างและใช้แตกต่างกัน สำหรับความแตกต่างของการใช้งานฉันไม่คุ้นเคยกับ Postgres มากพอที่จะตอบว่าฉันกลัว
ระบบดาวน์

4
@SystemDown ถึงแม้ว่าการจัดเก็บรหัสไปรษณีย์เป็นตัวละคร (5) อาจกัดคุณหากคุณเริ่มเป็นสากล รหัสไปรษณีย์ในสหราชอาณาจักรมีความยาวแตกต่างกันไปและตัวละคร 5 ตัวนั้นแทบจะไม่เพียงพอ ฉันไม่ทราบว่าพื้นที่ในรหัสไปรษณีย์ของสหราชอาณาจักรมีความเกี่ยวข้องกับการแยกวิเคราะห์หรือไม่
Vatine

5

ฐานข้อมูลมีความกังวลอย่างมากกับประสิทธิภาพ - ความเร็วและการลดการจัดเก็บ ในส่วนอื่น ๆ ของโลกคอมพิวเตอร์คุณจะไม่ต้องกังวลเกี่ยวกับจำนวนอักขระในสตริงอักขระของคุณ มันอาจเป็นหนึ่งมันอาจเป็นเนื้อหาทั้งหมดของสารานุกรม มันเป็นเพียงแค่สตริง ในความเป็นจริงภาษาจำนวนมากไม่ได้รบกวนคุณเกี่ยวกับว่าเป็นสตริงหรือตัวเลข

แต่เมื่อคอมพิวเตอร์เร็วขึ้นและเพิ่มหน่วยความจำมากขึ้นผู้คนจะนำข้อมูลเข้าสู่ฐานข้อมูลมากขึ้น สำหรับซีพียูฐานข้อมูลและหน่วยความจำนั้น จำกัด อยู่ในทุกวันนี้เหมือนกับในหน่วยความจำหลัก 64Kb และฮาร์ดไดรฟ์ 10Mb (ในคอมพิวเตอร์เมนเฟรม )

จำนวนไบต์คงที่นั้นง่ายต่อการจัดการมากกว่าหมายเลขความยาวผันแปร 10 ไบต์ง่ายต่อการจัดการมากกว่า 1,000,000 ดังนั้นฐานข้อมูลของคุณต้องการให้คุณให้เบาะแสเพื่อให้สามารถให้ผลลัพธ์เป็นกิกะไบต์จากเทอร์ราไบต์ของข้อมูลในหน่วยไมโครวินาที หากคุณไม่ได้ใช้ฐานข้อมูลของคุณอย่างหนักคุณจะไม่ต้องการความเร็วที่เสนอและจะรำคาญกับคำถามที่ไม่จำเป็น แต่ถ้าคุณต้องการการแสดงคุณก็ยินดีที่จะให้คำแนะนำ

ตามที่ระบุไว้ในคำตอบอื่น ๆ ใช้charถ้ามันใช้จำนวนอักขระเสมอvarcharถ้าความยาวสามารถเปลี่ยนแปลงได้ แต่มันก็ไม่ได้ใหญ่เกินไป (ฉันเดาว่า DB ส่วนใหญ่ถือว่าเป็นcharหรือtextขึ้นอยู่กับขนาด) และtextถ้ามัน อาจมีความยาวเท่าใดก็ได้ หากพยายาม SQL ของคุณที่จะใช้textคอลัมน์มันอาจจะดีที่สุดที่จะสรุปว่าอย่างใดและวางไว้ในcharหรือเล็กvarcharคอลัมน์ยังแล้วทำwhere'และorder by' s ว่า แน่นอนว่าการแสดงนั้นสำคัญกับคุณ

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