ฉันเห็นด้วยกับทุกอย่างที่พูดโดย a_horse_with_no_name และโดยทั่วไปฉันเห็นด้วยกับคำแนะนำความคิดเห็นของ Erwin:
ไม่ถ่านเป็นรอง (และล้าสมัย) ข้อความและ varchar ดำเนินการ (เกือบ) เหมือนกัน
เมตาดาต้า
ด้วยข้อยกเว้นเล็กน้อยหนึ่งครั้งเดียวที่ฉันใช้char()
คือเมื่อฉันต้องการให้ meta-data บอกว่าต้องมีตัวอักษร x แม้ว่าฉันจะรู้ว่าchar()
จะบ่นถ้าอินพุตเกินขีด จำกัด ฉันมักจะป้องกันไม่ให้มีผู้บุกรุกต่ำกว่าCHECK
ข้อ จำกัด ตัวอย่างเช่น,
CREATE TABLE foo (
x char(10) CHECK ( length(x) = 10 )
);
INSERT INTO foo VALUES (repeat('x', 9));
ฉันทำสิ่งนี้ด้วยเหตุผลบางประการ
char(x)
บางครั้งอนุมานด้วย schema-loader ว่าเป็นคอลัมน์ความกว้างคงที่ สิ่งนี้อาจสร้างความแตกต่างในภาษาที่เหมาะสำหรับสตริงที่มีความกว้างคงที่
- มันสร้างการประชุมที่เหมาะสมและบังคับใช้อย่างง่ายดาย ฉันสามารถเขียน schema-loader ในภาษาเพื่อสร้างรหัสจากการประชุมนี้
ต้องการตัวอย่างที่ฉันสามารถทำได้
- อักษรสองตัวอักษรย่อของรัฐ
ENUM
แต่เพราะรายการนี้สามารถแจกแจงฉันจะมักจะทำมันด้วย
- หมายเลขประจำตัวยานพาหนะ
- หมายเลขรุ่น (ขนาดคงที่)
เกี่ยวกับข้อผิดพลาด
สังเกตว่าบางคนอาจรู้สึกไม่สบายใจกับความไม่ลงรอยกันของข้อความแสดงข้อผิดพลาดทั้งสองด้านของขีด จำกัด แต่มันก็ไม่ได้รบกวนฉัน
test=# INSERT INTO foo VALUES (repeat('x', 9));
ERROR: new row for relation "foo" violates check constraint "foo_x_check"
DETAIL: Failing row contains (xxxxxxxxx ).
test=# INSERT INTO foo VALUES (repeat('x', 11));
ERROR: value too long for type character(10)
ตัดกันด้วย varchar
ยิ่งกว่านั้นฉันคิดว่าคำแนะนำข้างต้นนั้นเข้ากันได้ดีกับรูปแบบการใช้งานเกือบทุกtext
ครั้ง คุณถามvarchar(n)
ด้วย ฉันไม่เคยใช้มัน varchar(n)
อย่างน้อยผมก็จำไม่ได้ว่าครั้งสุดท้ายที่ผมใช้
- หากข้อมูลจำเพาะมีสนามคงมีความกว้างที่ผมเชื่อว่าผมใช้
char(n)
,
- มิฉะนั้นฉันใช้
text
ซึ่งมีประสิทธิภาพvarchar
(ไม่ จำกัด )
หากฉันพบข้อมูลจำเพาะที่มีข้อความตัวอักษรยาวหลายตัวแปรที่มีความหมายและฉันเชื่อว่ามีความยาวสูงสุดคงที่ฉันก็จะใช้varchar(n)
เช่นกัน อย่างไรก็ตามฉันไม่สามารถคิดอะไรที่เหมาะกับเกณฑ์นั้น
หมายเหตุเพิ่มเติม
คำถาม & คำตอบที่เกี่ยวข้อง: