ความแตกต่างระหว่างสตริงและข้อความในราง?


435

ฉันกำลังสร้างเว็บแอปใหม่ด้วย Rails และสงสัยว่าอะไรคือความแตกต่างระหว่างstringและtext? และควรใช้เมื่อใด?

คำตอบ:


522

ความแตกต่างขึ้นอยู่กับวิธีการแปลงสัญลักษณ์เป็นชนิดคอลัมน์ตามลำดับในภาษาแบบสอบถาม

กับ 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)

อ้างอิง:

http://www.packtpub.com/article/Working-with-Rails-ActiveRecord-Migrations-Models-Scaffolding-and-Database-Completion

ควรใช้แต่ละครั้งเมื่อใด

ตามกฎทั่วไปแล้วใช้:stringสำหรับการป้อนข้อความสั้น ๆ (ชื่อผู้ใช้อีเมลรหัสผ่านชื่อเรื่อง ฯลฯ ) และใช้:textสำหรับการป้อนข้อมูลที่คาดหวังนานขึ้นเช่นคำอธิบายเนื้อหาความคิดเห็น ฯลฯ


11
:textผมคิดว่ากฎที่ดีของหัวแม่มือคือการใช้เสมอ ดูdepesz.com/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text
Reed G. Law

74
สำหรับ MySQL - ไม่มากคุณสามารถมีดัชนีใน varchars คุณไม่สามารถใช้ข้อความได้
โอมาร์ Qureshi

12
การติดตั้ง PostgreSQL ชอบข้อความมากกว่า ความแตกต่างเพียงอย่างเดียวสำหรับสตริง / ข้อความ pg คือข้อ จำกัด ด้านความยาวของสตริง ไม่มีความแตกต่างด้านประสิทธิภาพ
Andy Bettisworth

ดูเหมือนว่าจะไม่เป็นเรื่องราวทั้งหมดของ ActiveRecord การบันทึกค่าtrueลงใน varchar (ergo, stringfield field) ใน MySQL ทำให้ค่าเป็นอนุกรม1(ซึ่งมีความยุติธรรมอย่างสมบูรณ์) อย่างไรก็ตามภายใต้textประเภทการจัดเก็บค่า "ความจริง" ปลายขึ้น serializing tเป็นถ่านเอกพจน์ tฉันอพยพคอลัมน์โดยไม่ทราบว่านี้และทุกแถวในอนาคตที่มีค่าเป็นจริงคือตอนนี้ ใครบ้างมีความเข้าใจอย่างถ่องแท้เกี่ยวกับพฤติกรรมนี้
ปีเตอร์

1
@ elli0t หมายความว่าคุณไม่สามารถสร้างดัชนีได้ หากเป็นสิ่งสำคัญคุณไม่ควรใช้ข้อความบน MySQL
Omar Qureshi

157

หากคุณใช้ postgres ให้ใช้ข้อความทุกที่เว้นแต่ว่าคุณมีข้อ จำกัด ด้านขนาดเนื่องจากไม่มีการปรับประสิทธิภาพสำหรับข้อความและ varchar

ไม่มีความแตกต่างด้านประสิทธิภาพระหว่างสามประเภทนี้นอกเหนือจากพื้นที่เก็บข้อมูลที่เพิ่มขึ้นเมื่อใช้ประเภทที่มีเบาะรองและรอบ CPU เพิ่มเติมไม่กี่รอบเพื่อตรวจสอบความยาวเมื่อจัดเก็บในคอลัมน์ที่มีความยาว จำกัด ในขณะที่ตัวละคร (n) มีข้อได้เปรียบด้านประสิทธิภาพในบางระบบฐานข้อมูลอื่น ๆ แต่ก็ไม่มีข้อได้เปรียบใน PostgreSQL ในความเป็นจริงตัวละคร (n) มักจะช้าที่สุดในสามเพราะค่าใช้จ่ายในการจัดเก็บเพิ่มเติม ในสถานการณ์ส่วนใหญ่ข้อความหรือตัวละครที่แตกต่างกันควรใช้แทน

คู่มือ PostsgreSQL


4
แต่เพื่อประโยชน์ในการเป็นผู้ไม่เชื่อเรื่องฐานข้อมูลนี่เป็นวิธีที่ดีที่สุดหรือไม่? ถ้าคุณต้องการเปลี่ยนฐานข้อมูล ฉันให้ในโลกแห่งความเป็นจริงที่ไม่ได้เกิดขึ้นบ่อยครั้ง แต่ยัง ... ถ้าไม่มี 'ความแตกต่างรอบตัว' ทำไมไม่ยึดติดกับการใช้สายคาดสำหรับสิ่งสั้นและข้อความสำหรับสิ่งที่ยาวกว่า? และรับสายดัชนีการแสดงความคิดเห็นของคุณเองก็ยังคงเป็นวิธีที่ดีที่สุด
Dan Barron

6
มีสาเหตุหลายประการที่อาจจำเป็นในโลกแห่งความจริงซึ่งเป็นสิ่งที่ดีที่สุดที่จะแสดงความคิดเห็นว่ามี One True Solution สำหรับปัญหาใด ๆ
Dan Barron

14
อาจเป็นเช่นนั้น แต่การไม่เชื่อเรื่องพระเจ้าของฐานข้อมูลเป็นผู้เผยพระวจนะเท็จ
Omar Qureshi

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

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

17

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...คอลัมน์ข้อความของคุณจะถูกโหลด นี่อาจไม่เป็นปัญหาจริงในแอปของคุณหรือของฉัน (การเพิ่มประสิทธิภาพก่อนกำหนดคือ ... ) แต่การรู้ว่าข้อความนั้นไม่ "ฟรี" เสมอไปเป็นการดีที่จะรู้


12

สตริงถ้าขนาดได้รับการแก้ไขและมีขนาดเล็กและข้อความถ้ามันเป็นตัวแปรและใหญ่ สิ่งนี้สำคัญเนื่องจากข้อความมีขนาดใหญ่กว่าสตริง มันมีกิโลไบต์มากขึ้น

ดังนั้นสำหรับฟิลด์เล็ก ๆ ให้ใช้สตริง (varchar) เสมอ สาขาที่ชอบ ชื่อ _, เข้าสู่ระบบ, อีเมล, หัวเรื่อง (ของบทความหรือโพสต์) และตัวอย่างของข้อความ: เนื้อหา / เนื้อหาของโพสต์หรือบทความ ฟิลด์สำหรับย่อหน้า ฯลฯ

ขนาดสตริง 1 ถึง 255 (ค่าเริ่มต้น = 255)

ขนาดตัวอักษร 1 ถึง 4294967296 (ค่าเริ่มต้น = 65536) 2


11

ดังที่อธิบายไว้ข้างต้นไม่เพียง แต่ประเภทข้อมูล db แต่มันจะส่งผลกระทบต่อมุมมองที่จะสร้างขึ้นหากคุณกำลังนั่งร้าน สตริงจะสร้างข้อความ text_field จะสร้าง text_area


2

ใช้สตริงสำหรับฟิลด์ที่สั้นกว่าเช่นชื่อที่อยู่โทรศัพท์ บริษัท

ใช้ข้อความสำหรับเนื้อหาความคิดเห็นเนื้อหาย่อหน้า

กฎทั่วไปของฉัน, ถ้ามันเป็นอะไรที่มากกว่าหนึ่งบรรทัด, ฉันมักจะไปหาข้อความ, ถ้ามันสั้น 2-6 คำ, ฉันไปหาสตริง

กฎอย่างเป็นทางการคือ 255 สำหรับสตริง ดังนั้นหากสตริงของคุณมีอักขระมากกว่า 255 ตัวให้ไปหาข้อความ


1

หากคุณกำลังใช้ 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 }
}

https://github.com/rsim/oracle-enhanced/blob/master/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb


1

คำตอบที่ได้รับการยอมรับนั้นยอดเยี่ยมมันอธิบายความแตกต่างระหว่าง 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

0

ถ้าแอตทริบิวต์คือการจับคู่f.text_fieldในการใช้งานรูปแบบสตริงถ้ามันเป็นตรงกับf.text_areaการใช้งานข้อความ

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