जवाबों:
यह अंतर इस बात पर निर्भर करता है कि क्वेरी भाषा में प्रतीक को अपने संबंधित कॉलम प्रकार में कैसे बदला जाता है।
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)
संदर्भ:
प्रत्येक का उपयोग कब किया जाना चाहिए?
अंगूठे के एक सामान्य नियम के रूप में, :string
संक्षिप्त पाठ इनपुट (उपयोगकर्ता नाम, ईमेल, पासवर्ड, शीर्षक, आदि) और :text
लंबे समय तक अपेक्षित इनपुट जैसे विवरण, टिप्पणी सामग्री आदि के लिए उपयोग करें ।
true
एक varchar (एर्गो, string
टाइप फील्ड) के लिए मूल्य को सहेजना मूल्य को 1
(जो पूरी तरह से उचित है) क्रमबद्ध करता है। हालांकि, text
प्रकार के तहत , मूल्य को "सच" बताते हुए इसे एक विलक्षण चार के रूप में क्रमबद्ध किया जाता है t
। मैंने यह और भविष्य की सभी पंक्तियों को साकार किए बिना एक कॉलम माइग्रेट किया जहां मूल्य अब सच है t
। किसी को भी इस व्यवहार में कोई अंतर्दृष्टि है?
यदि आप पोस्टग्रैस का उपयोग कर रहे हैं, तो आप जहां भी पाठ का उपयोग कर सकते हैं, जब तक कि आपके पास आकार की बाधा न हो, क्योंकि पाठ बनाम प्रतिचक्र के लिए कोई प्रदर्शन दंड नहीं है
इन तीन प्रकारों के बीच कोई प्रदर्शन अंतर नहीं है, खाली-गद्देदार प्रकार का उपयोग करते समय स्टोरेज की बढ़ी हुई जगह के अलावा, और कुछ अतिरिक्त सीपीयू चक्रों को लंबाई की कमी वाले कॉलम में संग्रहीत करने के लिए लंबाई की जांच करने के लिए। जबकि चरित्र (एन) कुछ अन्य डेटाबेस सिस्टम में प्रदर्शन लाभ है, PostgreSQL में ऐसा कोई लाभ नहीं है; वास्तव में चरित्र (n) आमतौर पर इसकी अतिरिक्त भंडारण लागत के कारण तीनों में सबसे धीमा है। ज्यादातर स्थितियों में इसके बजाय पाठ या चरित्र भिन्न का उपयोग किया जाना चाहिए
text
करने के लिए उस ब्लॉग पोस्ट (n)
के तर्क आश्वस्त हैं, लेकिन text
अधिक उपयोग करने varchar
का तर्क नहीं है। वह कहते हैं कि वे समान हैं लेकिन पसंद करते हैं text
क्योंकि varchar
भ्रमित हो सकते हैं varchar(n)
और क्योंकि text
टाइप करने के लिए कम वर्ण हैं। लेकिन text
इसके बजाय का उपयोग करते हुए varchar
, आप इस संदर्भ को खो देते हैं कि संग्रहीत डेटा लंबा नहीं होना चाहिए। उदाहरण के लिए, किसी उपयोगकर्ता नाम को संग्रहीत text
करना मुझे भ्रामक लगता है।
स्ट्रिंग आपके डेटाबेस में "वर्चर" का अनुवाद करता है, जबकि पाठ "पाठ" में अनुवाद करता है। एक varchar में बहुत कम आइटम हो सकते हैं, एक पाठ किसी भी लम्बाई (लगभग) का हो सकता है।
अच्छे संदर्भों के साथ गहराई से विश्लेषण के लिए http://www.pythian.com/news/7129/text-vs-varchar/ देखें
संपादित करें: कुछ डेटाबेस इंजन varchar
एक बार में लोड कर सकते हैं, लेकिन तालिका के बाहर पाठ (और ब्लॉब) स्टोर कर सकते हैं। एक SELECT name, amount FROM products
, बहुत धीमी का उपयोग करते समय हो सकता है text
के लिए name
की तुलना में जब आप का उपयोग करें varchar
। और चूंकि रेल, SELECT * FROM...
आपके पाठ-कॉलम के साथ डिफ़ॉल्ट लोड रिकॉर्ड द्वारा लोड किया जाएगा। यह शायद आपके या मेरे ऐप में एक वास्तविक समस्या नहीं होगी, हालाँकि (समयपूर्व अनुकूलन ... है)। लेकिन यह जानना कि पाठ हमेशा "मुक्त" नहीं होता है, यह जानना अच्छा है।
स्ट्रिंग यदि आकार निश्चित है और छोटा और पाठ यदि यह चर और बड़ा है। यह एक तरह से महत्वपूर्ण है क्योंकि पाठ तार से बड़ा है। इसमें बहुत अधिक किलोबाइट होते हैं।
तो छोटे क्षेत्रों के लिए हमेशा स्ट्रिंग (varchar) का उपयोग करें। फील्ड्स की तरह। First_name, लॉगिन, ईमेल, विषय (एक लेख या पोस्ट का) और ग्रंथों का उदाहरण: पोस्ट या लेख की सामग्री / शरीर। पैराग्राफ आदि के लिए फ़ील्ड
स्ट्रिंग आकार 1 से 255 (डिफ़ॉल्ट = 255)
पाठ का आकार 1 से 4294967296 (डिफ़ॉल्ट = 65536) 2
नाम, पता, फोन, कंपनी जैसे छोटे क्षेत्र के लिए स्ट्रिंग का उपयोग करें
बड़ी सामग्री, टिप्पणियों, सामग्री, पैराग्राफ के लिए पाठ का उपयोग करें।
मेरा सामान्य नियम, अगर यह कुछ ऐसा है जो एक से अधिक पंक्ति में है, तो मैं आमतौर पर पाठ के लिए जाता हूं, यदि यह छोटा 2-6 शब्द है, तो मैं स्ट्रिंग के लिए जाता हूं।
एक स्ट्रिंग के लिए आधिकारिक नियम 255 है। इसलिए, यदि आपका स्ट्रिंग 255 वर्णों से अधिक है, तो पाठ के लिए जाएं।
यदि आप 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 }
}
स्वीकृत उत्तर बहुत बढ़िया है, यह स्ट्रिंग बनाम टेक्स्ट के बीच अंतर (ज्यादातर डेटाबेस में सीमा आकार, लेकिन कुछ अन्य गोत्र हैं) को ठीक से समझाता है, लेकिन मैं एक छोटे से मुद्दे को इंगित करना चाहता था जो मुझे उस उत्तर के माध्यम से मिला। पूरी तरह से मेरे लिए यह नहीं किया।
अधिकतम आकार : सीमा => 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
यदि विशेषता f.text_field
प्रपत्र उपयोग स्ट्रिंग में मेल खा रही है , यदि यह f.text_area
उपयोग पाठ से मेल खा रहा है ।
:text
। देखें depesz.com/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text