ฉันกำลังสร้างเว็บแอปใหม่ด้วย 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, stringfield 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)คอลัมน์และเป็นTEXTCLOB
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