ฉันกำลังสร้างเว็บแอปใหม่ด้วย Rails และสงสัยว่าอะไรคือความแตกต่างระหว่างstring
และtext
? และควรใช้เมื่อใด?
ฉันกำลังสร้างเว็บแอปใหม่ด้วย Rails และสงสัยว่าอะไรคือความแตกต่างระหว่างstring
และtext
? และควรใช้เมื่อใด?
คำตอบ:
ความแตกต่างขึ้นอยู่กับวิธีการแปลงสัญลักษณ์เป็นชนิดคอลัมน์ตามลำดับในภาษาแบบสอบถาม
กับ MySQL: สตริงถูกแมปกับ VARCHAR (255) - http://guides.rubyonrails.org/migrations.html
:string | VARCHAR | :limit => 1 to 255 (default = 255)
:text | TINYTEXT, TEXT, MEDIUMTEXT, or LONGTEXT2 | :limit => 1 to 4294967296 (default = 65536)
อ้างอิง:
ควรใช้แต่ละครั้งเมื่อใด
ตามกฎทั่วไปแล้วใช้:string
สำหรับการป้อนข้อความสั้น ๆ (ชื่อผู้ใช้อีเมลรหัสผ่านชื่อเรื่อง ฯลฯ ) และใช้:text
สำหรับการป้อนข้อมูลที่คาดหวังนานขึ้นเช่นคำอธิบายเนื้อหาความคิดเห็น ฯลฯ
true
ลงใน varchar (ergo, string
field field) ใน MySQL ทำให้ค่าเป็นอนุกรม1
(ซึ่งมีความยุติธรรมอย่างสมบูรณ์) อย่างไรก็ตามภายใต้text
ประเภทการจัดเก็บค่า "ความจริง" ปลายขึ้น serializing t
เป็นถ่านเอกพจน์ t
ฉันอพยพคอลัมน์โดยไม่ทราบว่านี้และทุกแถวในอนาคตที่มีค่าเป็นจริงคือตอนนี้ ใครบ้างมีความเข้าใจอย่างถ่องแท้เกี่ยวกับพฤติกรรมนี้
หากคุณใช้ postgres ให้ใช้ข้อความทุกที่เว้นแต่ว่าคุณมีข้อ จำกัด ด้านขนาดเนื่องจากไม่มีการปรับประสิทธิภาพสำหรับข้อความและ varchar
ไม่มีความแตกต่างด้านประสิทธิภาพระหว่างสามประเภทนี้นอกเหนือจากพื้นที่เก็บข้อมูลที่เพิ่มขึ้นเมื่อใช้ประเภทที่มีเบาะรองและรอบ CPU เพิ่มเติมไม่กี่รอบเพื่อตรวจสอบความยาวเมื่อจัดเก็บในคอลัมน์ที่มีความยาว จำกัด ในขณะที่ตัวละคร (n) มีข้อได้เปรียบด้านประสิทธิภาพในบางระบบฐานข้อมูลอื่น ๆ แต่ก็ไม่มีข้อได้เปรียบใน PostgreSQL ในความเป็นจริงตัวละคร (n) มักจะช้าที่สุดในสามเพราะค่าใช้จ่ายในการจัดเก็บเพิ่มเติม ในสถานการณ์ส่วนใหญ่ข้อความหรือตัวละครที่แตกต่างกันควรใช้แทน
text
เกิน(n)
ประเภทข้อมูลนั้นน่าเชื่อถือ แต่อาร์กิวเมนต์สำหรับการใช้text
เกินvarchar
นั้นไม่ได้ เขาบอกว่าพวกเขาเหมือนกัน แต่ชอบtext
เพราะvarchar
อาจสับสนvarchar(n)
และtext
เป็นเพราะตัวละครน้อยลง แต่การใช้text
แทนคุณvarchar
จะสูญเสียบริบทที่ข้อมูลที่เก็บไว้ไม่ควรยาว ตัวอย่างเช่นการจัดเก็บชื่อผู้ใช้ที่text
ดูเหมือนจะทำให้ฉันเข้าใจผิด
String แปลเป็น "Varchar" ในฐานข้อมูลของคุณในขณะที่ข้อความแปลเป็น "text" varchar สามารถมีรายการน้อยกว่ามากข้อความสามารถมีความยาว (เกือบ) ได้
สำหรับการวิเคราะห์เชิงลึกพร้อมการอ้างอิงที่ดีโปรดดูที่ http://www.pythian.com/news/7129/text-vs-varchar/
แก้ไข: เอ็นจิ้นฐานข้อมูลบางตัวสามารถโหลดได้varchar
ในครั้งเดียว แต่เก็บข้อความ (และหยด) ไว้นอกตาราง SELECT name, amount FROM products
อาจจะช้ามากเมื่อใช้text
สำหรับกว่าที่ท่านใช้name
varchar
และเนื่องจาก Rails โดยค่าเริ่มต้นโหลดบันทึกด้วยSELECT * FROM...
คอลัมน์ข้อความของคุณจะถูกโหลด นี่อาจไม่เป็นปัญหาจริงในแอปของคุณหรือของฉัน (การเพิ่มประสิทธิภาพก่อนกำหนดคือ ... ) แต่การรู้ว่าข้อความนั้นไม่ "ฟรี" เสมอไปเป็นการดีที่จะรู้
สตริงถ้าขนาดได้รับการแก้ไขและมีขนาดเล็กและข้อความถ้ามันเป็นตัวแปรและใหญ่ สิ่งนี้สำคัญเนื่องจากข้อความมีขนาดใหญ่กว่าสตริง มันมีกิโลไบต์มากขึ้น
ดังนั้นสำหรับฟิลด์เล็ก ๆ ให้ใช้สตริง (varchar) เสมอ สาขาที่ชอบ ชื่อ _, เข้าสู่ระบบ, อีเมล, หัวเรื่อง (ของบทความหรือโพสต์) และตัวอย่างของข้อความ: เนื้อหา / เนื้อหาของโพสต์หรือบทความ ฟิลด์สำหรับย่อหน้า ฯลฯ
ขนาดสตริง 1 ถึง 255 (ค่าเริ่มต้น = 255)
ขนาดตัวอักษร 1 ถึง 4294967296 (ค่าเริ่มต้น = 65536) 2
ดังที่อธิบายไว้ข้างต้นไม่เพียง แต่ประเภทข้อมูล db แต่มันจะส่งผลกระทบต่อมุมมองที่จะสร้างขึ้นหากคุณกำลังนั่งร้าน สตริงจะสร้างข้อความ text_field จะสร้าง text_area
ใช้สตริงสำหรับฟิลด์ที่สั้นกว่าเช่นชื่อที่อยู่โทรศัพท์ บริษัท
ใช้ข้อความสำหรับเนื้อหาความคิดเห็นเนื้อหาย่อหน้า
กฎทั่วไปของฉัน, ถ้ามันเป็นอะไรที่มากกว่าหนึ่งบรรทัด, ฉันมักจะไปหาข้อความ, ถ้ามันสั้น 2-6 คำ, ฉันไปหาสตริง
กฎอย่างเป็นทางการคือ 255 สำหรับสตริง ดังนั้นหากสตริงของคุณมีอักขระมากกว่า 255 ตัวให้ไปหาข้อความ
หากคุณกำลังใช้ Oracle ... STRING
จะได้รับการสร้างขึ้นเป็นVARCHAR(255)
คอลัมน์และเป็นTEXT
CLOB
NATIVE_DATABASE_TYPES = {
primary_key: "NUMBER(38) NOT NULL PRIMARY KEY",
string: { name: "VARCHAR2", limit: 255 },
text: { name: "CLOB" },
ntext: { name: "NCLOB" },
integer: { name: "NUMBER", limit: 38 },
float: { name: "BINARY_FLOAT" },
decimal: { name: "DECIMAL" },
datetime: { name: "TIMESTAMP" },
timestamp: { name: "TIMESTAMP" },
timestamptz: { name: "TIMESTAMP WITH TIME ZONE" },
timestampltz: { name: "TIMESTAMP WITH LOCAL TIME ZONE" },
time: { name: "TIMESTAMP" },
date: { name: "DATE" },
binary: { name: "BLOB" },
boolean: { name: "NUMBER", limit: 1 },
raw: { name: "RAW", limit: 2000 },
bigint: { name: "NUMBER", limit: 19 }
}
คำตอบที่ได้รับการยอมรับนั้นยอดเยี่ยมมันอธิบายความแตกต่างระหว่าง string vs text (ส่วนใหญ่มีขนาด จำกัด ในฐานข้อมูล แต่มี gotchas อื่น ๆ อีกสองสามตัว) แต่ฉันต้องการชี้ให้เห็นปัญหาเล็ก ๆ ไม่ได้ทำเพื่อฉันอย่างสมบูรณ์
ขนาดสูงสุด: จำกัด => 1 ถึง 4294967296ไม่ทำงานอย่างที่ฉันต้องการฉันต้องไป -1 จากขนาดสูงสุดนั้น ฉันกำลังจัดเก็บ JSON blobs ขนาดใหญ่และบางครั้งพวกเขาอาจบ้าคลั่งอย่างมาก
นี่คือการโยกย้ายของฉันที่มีค่ามากกว่าพร้อมกับค่า MySQL ไม่บ่น
สังเกต5เมื่อสิ้นสุดขีด จำกัด แทน6
class ChangeUserSyncRecordDetailsToText < ActiveRecord::Migration[5.1]
def up
change_column :user_sync_records, :details, :text, :limit => 4294967295
end
def down
change_column :user_sync_records, :details, :string, :limit => 1000
end
end
ถ้าแอตทริบิวต์คือการจับคู่f.text_field
ในการใช้งานรูปแบบสตริงถ้ามันเป็นตรงกับf.text_area
การใช้งานข้อความ
:text
ผมคิดว่ากฎที่ดีของหัวแม่มือคือการใช้เสมอ ดูdepesz.com/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text