रेल और तार के बीच अंतर रेल में?


435

मैं रेल का उपयोग कर एक नया वेब अनुप्रयोग बना रही हूँ, और सोच रहा था, के बीच क्या फर्क है stringऔर text? और प्रत्येक का उपयोग कब किया जाना चाहिए?

जवाबों:


522

यह अंतर इस बात पर निर्भर करता है कि क्वेरी भाषा में प्रतीक को अपने संबंधित कॉलम प्रकार में कैसे बदला जाता है।

MySQL के साथ: स्ट्रिंग को VARCHAR (255) में मैप किया गया है - http://guides.rubyonrails.org/migations.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
रीड जी। कानून

74
MySQL के लिए - इतना नहीं है, आप varchars पर अनुक्रमित कर सकते हैं, आप पाठ पर नहीं कर सकते।
उमर कुरैशी

12
PostgreSQL कार्यान्वयन पाठ को प्राथमिकता देता है। पीजी स्ट्रिंग / पाठ के लिए एकमात्र अंतर स्ट्रिंग के लिए लंबाई पर बाधा है। कोई प्रदर्शन अंतर नहीं।
एंडी बेट्सवर्थ

यह ActiveRecord के साथ पूरी कहानी नहीं लगती है। MySQL में trueएक varchar (एर्गो, stringटाइप फील्ड) के लिए मूल्य को सहेजना मूल्य को 1(जो पूरी तरह से उचित है) क्रमबद्ध करता है। हालांकि, textप्रकार के तहत , मूल्य को "सच" बताते हुए इसे एक विलक्षण चार के रूप में क्रमबद्ध किया जाता है t। मैंने यह और भविष्य की सभी पंक्तियों को साकार किए बिना एक कॉलम माइग्रेट किया जहां मूल्य अब सच है t। किसी को भी इस व्यवहार में कोई अंतर्दृष्टि है?
पीटर

1
@ elli0t का अर्थ है कि आप अनुक्रमणिका में सक्षम नहीं होंगे। यदि यह महत्वपूर्ण है, तो आपको
उमर कुरैशी

157

यदि आप पोस्टग्रैस का उपयोग कर रहे हैं, तो आप जहां भी पाठ का उपयोग कर सकते हैं, जब तक कि आपके पास आकार की बाधा न हो, क्योंकि पाठ बनाम प्रतिचक्र के लिए कोई प्रदर्शन दंड नहीं है

इन तीन प्रकारों के बीच कोई प्रदर्शन अंतर नहीं है, खाली-गद्देदार प्रकार का उपयोग करते समय स्टोरेज की बढ़ी हुई जगह के अलावा, और कुछ अतिरिक्त सीपीयू चक्रों को लंबाई की कमी वाले कॉलम में संग्रहीत करने के लिए लंबाई की जांच करने के लिए। जबकि चरित्र (एन) कुछ अन्य डेटाबेस सिस्टम में प्रदर्शन लाभ है, PostgreSQL में ऐसा कोई लाभ नहीं है; वास्तव में चरित्र (n) आमतौर पर इसकी अतिरिक्त भंडारण लागत के कारण तीनों में सबसे धीमा है। ज्यादातर स्थितियों में इसके बजाय पाठ या चरित्र भिन्न का उपयोग किया जाना चाहिए

PostgreSQL मैनुअल


4
लेकिन डेटाबेस अज्ञेयवादी होने के हित में, क्या यह सबसे अच्छा तरीका है? यदि आप डेटाबेस बदलना चाहते हैं तो क्या होगा? मैं अनुदान देता हूं, वास्तविक दुनिया में जो अक्सर नहीं होता है, लेकिन फिर भी ... अगर 'कोई मतभेद नहीं है' तो छोटी चीजों के लिए स्ट्रिंग के अपेक्षित उपयोग और लंबी चीजों के लिए पाठ से क्यों न चिपके? और अपनी खुद की टिप्पणी अनुक्रमण स्ट्रिंग्स को देखते हुए, अभी भी सबसे अच्छा तरीका लगता है।
डैन बैरन

6
वास्तविक दुनिया में यह क्यों आवश्यक हो सकता है, इसके कई कारण हैं, जहां यह धारणा को खत्म करना सबसे अच्छा है कि किसी भी समस्या के लिए एक सच्चा समाधान है।
दान बैरन

14
ऐसा हो सकता है, लेकिन डेटाबेस अज्ञेयवाद एक गलत नबी है।
उमर कुरैशी

2
क्या किसी को इस बारे में कोई जानकारी नहीं है कि प्रदर्शन जुर्माना महत्वपूर्ण है या यह समय से पहले अनुकूलन का मामला है? मेरा अनुमान है कि आप कभी भी एक अंतर नहीं देखेंगे, जो पैराग्राफ के उद्घाटन की पुष्टि करता है: "इन तीन प्रकारों के बीच कोई प्रदर्शन अंतर नहीं है"।
डेनिस

5
आप एक अच्छा मुद्दा बनाते हैं, लेकिन मैं पूरी तरह से आश्वस्त नहीं हूं। डेटा प्रकारों का उपयोग textकरने के लिए उस ब्लॉग पोस्ट (n)के तर्क आश्वस्त हैं, लेकिन textअधिक उपयोग करने varcharका तर्क नहीं है। वह कहते हैं कि वे समान हैं लेकिन पसंद करते हैं textक्योंकि varcharभ्रमित हो सकते हैं varchar(n)और क्योंकि textटाइप करने के लिए कम वर्ण हैं। लेकिन textइसके बजाय का उपयोग करते हुए varchar, आप इस संदर्भ को खो देते हैं कि संग्रहीत डेटा लंबा नहीं होना चाहिए। उदाहरण के लिए, किसी उपयोगकर्ता नाम को संग्रहीत textकरना मुझे भ्रामक लगता है।
डेनिस

17

स्ट्रिंग आपके डेटाबेस में "वर्चर" का अनुवाद करता है, जबकि पाठ "पाठ" में अनुवाद करता है। एक varchar में बहुत कम आइटम हो सकते हैं, एक पाठ किसी भी लम्बाई (लगभग) का हो सकता है।

अच्छे संदर्भों के साथ गहराई से विश्लेषण के लिए http://www.pythian.com/news/7129/text-vs-varchar/ देखें

संपादित करें: कुछ डेटाबेस इंजन varcharएक बार में लोड कर सकते हैं, लेकिन तालिका के बाहर पाठ (और ब्लॉब) स्टोर कर सकते हैं। एक SELECT name, amount FROM products, बहुत धीमी का उपयोग करते समय हो सकता है textके लिए nameकी तुलना में जब आप का उपयोग करें varchar। और चूंकि रेल, SELECT * FROM...आपके पाठ-कॉलम के साथ डिफ़ॉल्ट लोड रिकॉर्ड द्वारा लोड किया जाएगा। यह शायद आपके या मेरे ऐप में एक वास्तविक समस्या नहीं होगी, हालाँकि (समयपूर्व अनुकूलन ... है)। लेकिन यह जानना कि पाठ हमेशा "मुक्त" नहीं होता है, यह जानना अच्छा है।


12

स्ट्रिंग यदि आकार निश्चित है और छोटा और पाठ यदि यह चर और बड़ा है। यह एक तरह से महत्वपूर्ण है क्योंकि पाठ तार से बड़ा है। इसमें बहुत अधिक किलोबाइट होते हैं।

तो छोटे क्षेत्रों के लिए हमेशा स्ट्रिंग (varchar) का उपयोग करें। फील्ड्स की तरह। First_name, लॉगिन, ईमेल, विषय (एक लेख या पोस्ट का) और ग्रंथों का उदाहरण: पोस्ट या लेख की सामग्री / शरीर। पैराग्राफ आदि के लिए फ़ील्ड

स्ट्रिंग आकार 1 से 255 (डिफ़ॉल्ट = 255)

पाठ का आकार 1 से 4294967296 (डिफ़ॉल्ट = 65536) 2


11

जैसा कि ऊपर बताया गया है कि सिर्फ db डेटाटाइप नहीं है, यह उस दृश्य को भी प्रभावित करेगा जो उत्पन्न होगा यदि आप मचान हैं। string एक text_field टेक्स्ट उत्पन्न करेगी एक text_area उत्पन्न करेगी


2

नाम, पता, फोन, कंपनी जैसे छोटे क्षेत्र के लिए स्ट्रिंग का उपयोग करें

बड़ी सामग्री, टिप्पणियों, सामग्री, पैराग्राफ के लिए पाठ का उपयोग करें।

मेरा सामान्य नियम, अगर यह कुछ ऐसा है जो एक से अधिक पंक्ति में है, तो मैं आमतौर पर पाठ के लिए जाता हूं, यदि यह छोटा 2-6 शब्द है, तो मैं स्ट्रिंग के लिए जाता हूं।

एक स्ट्रिंग के लिए आधिकारिक नियम 255 है। इसलिए, यदि आपका स्ट्रिंग 255 वर्णों से अधिक है, तो पाठ के लिए जाएं।


1

यदि आप oracle का उपयोग कर रहे हैं ... स्तंभ STRINGके रूप में बनाया जाएगा VARCHAR(255)और TEXT, a के रूप में 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 }
}

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


1

स्वीकृत उत्तर बहुत बढ़िया है, यह स्ट्रिंग बनाम टेक्स्ट के बीच अंतर (ज्यादातर डेटाबेस में सीमा आकार, लेकिन कुछ अन्य गोत्र हैं) को ठीक से समझाता है, लेकिन मैं एक छोटे से मुद्दे को इंगित करना चाहता था जो मुझे उस उत्तर के माध्यम से मिला। पूरी तरह से मेरे लिए यह नहीं किया।

अधिकतम आकार : सीमा => 1 से 4294967296 पूरी तरह से काम नहीं किया, मुझे उस अधिकतम आकार से -1 जाने की आवश्यकता थी। मैं बड़े JSON ब्लब्स का भंडारण कर रहा हूं और वे कभी-कभी पागल हो सकते हैं।

यहां मेरा माइग्रेशन उस बड़े मान के साथ होता है जिस मूल्य के साथ 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उपयोग पाठ से मेल खा रहा है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.