URL के लिए सर्वश्रेष्ठ डेटाबेस फ़ील्ड प्रकार


352

मुझे एक MySQL तालिका में एक url संग्रहीत करने की आवश्यकता है। एक क्षेत्र को परिभाषित करने के लिए सबसे अच्छा अभ्यास क्या है जो एक अनिर्धारित लंबाई के साथ एक यूआरएल रखेगा?


1
यह इस बात पर निर्भर करता है कि आपको क्या चाहिए, अनुक्रमण, एकता?
थॉमस डेक्सक्स

2
मैं यहाँ एक बिल्कुल सीधे जवाब की उम्मीद कर रहा था लेकिन उन मदों को कवर करने वाले उत्तरों पर काफी आश्चर्यचकित था जिन्हें मैंने नहीं माना था। बहुत दिलचस्प पढ़ने कि मैं अपने शैक्षिक खाते में जोड़ दिया है।
HPWD

1
बस TEXTटाइप करें और नीचे दिए गए इन सभी उत्तरों को पढ़ना छोड़ दें। अंत में, यही उनमें से ज्यादातर का सुझाव है। :) बेशक, अगर आपको अनुक्रमण या विशिष्टता की आवश्यकता है, तो जाएं VARCHAR, क्योंकि आसानी सेTEXT अनुक्रमित नहीं किया जा सकता है ।
अलेक्जेंडर

जवाबों:


324
  1. लोकप्रिय वेब ब्राउज़रों में सबसे सामान्य सामान्य भाजक अधिकतम URL लंबाई: 2,083 (इंटरनेट एक्सप्लोरर)

  2. http://dev.mysql.com/doc/refman/5.0/en/char.html
    VARCHAR कॉलम में मान चर-लंबाई तार हैं। लंबाई MySQL 5.0.3 से पहले 0 से 255 तक और 5.0.3 और बाद के संस्करणों में 0 से 65,535 तक मान के रूप में निर्दिष्ट किया जा सकता है। MySQL 5.0.3 और बाद में VARCHAR की प्रभावी अधिकतम लंबाई अधिकतम पंक्ति आकार (65,535 बाइट्स, जो सभी स्तंभों के बीच साझा की गई है) और उपयोग किए गए वर्ण सेट के अधीन है।

  3. तो ...
    <MySQL 5.0.3 TEXT
    या
    > = MySQL 5.0.3 उपयोग VARCHAR (2083) का उपयोग करें


14
अच्छा जवाब, लेकिन व्यक्तिगत मैं लंबाई सीमित करूंगा। प्रोजेक्ट के आधार पर आप स्वीकृत यूआरएल को सीमित करना चाह सकते हैं। 200 से अधिक url longet का उपयोग कौन करता है?
जॉन

2
वे बेहतर ढंग से एक uri डेटाटाइप के साथ आएंगे जो "uri की संरचना को" समझता है "ताकि अनुक्रमण और खोज कुशलतापूर्वक की जाए, जैसे oracle ने किया था ... प्रतीक्षा करें, mysql अब oracle का ... download.oracle.com/docs" है cd / B10464_05 / web.904 / b12099 /…
लाल रंग

80
यह जवाब थोड़ा भ्रामक है। ध्यान दें कि यहां "सबसे कम सामान्य भाजक" व्यर्थ है, आप उच्चतम संख्या का उपयोग करना चाहते हैं जो एक ब्राउज़र या सर्वर स्वीकार करेगा (जो कि सुसंगत नहीं है और परिवर्तन के अधीन है)। जैसा कि आपका लिंक कहता है: " ... HTTP प्रोटोकॉल के विनिर्देश किसी भी अधिकतम लंबाई को निर्दिष्ट नहीं करते हैं ... ", इसलिए इसके साथ परेशान न VARCHAR(2083)करें, बस उपयोग करें TEXT
वेस्ले मर्च

4
उदाहरण, आपके लिंक से भी: " 65,536 वर्णों के बाद, स्थान बार अब विंडोज फ़ायरफ़ॉक्स 1.5.x में URL प्रदर्शित नहीं करता है। हालाँकि, अब URL काम करेंगे। मैंने 100,000 वर्णों के बाद परीक्षण रोक दिया है। "
वेस्ले मर्च

1
Boutell.com संसाधन जाल से गिर गया। यहाँ स्कैन की गई ओ'रेली पुस्तक में इसका संदर्भ दिया गया है: books.google.ca/…
micahwittman

33

VARCHAR(512)(या समान) पर्याप्त होना चाहिए। हालाँकि, चूंकि आपको वास्तव में URL की अधिकतम लंबाई का पता नहीं है, इसलिए मैं सीधे जा सकता हूं TEXT। इस तरह का खतरा CLOBएक साधारण स्ट्रिंग डेटाटाइप की तुलना में कहीं धीमा होने के कारण दक्षता का नुकसान है VARCHAR


क्या टकराव के बारे में?
कोमराधोमेर

16

varchar(max) SQLServer2005 के लिए

varchar(65535) MySQL 5.0.3 और बाद के लिए

यह जरूरत के अनुसार भंडारण का आवंटन करेगा और प्रदर्शन को प्रभावित नहीं करेगा।


1
आपके स्निपेट में, maxआवश्यक के रूप में VARCHAR आकार बढ़ने के लिए एक जादू एएनएसआई एसक्यूएल विनिर्देशक है, या यह केवल उदाहरण के लिए एक मेटा-चर है?
डैनियल स्पिवक ऑक्ट

4
MySQL में आप सबसे अधिक संभावना एक varchar नहीं कर सकते हैं जब तक कि यह तालिका में एकमात्र स्तंभ न हो।
कार्सन

1
@ डैनियल स्पाइवैक: "TEXT और VARCHAR (MAX) के बीच बुनियादी अंतर यह है कि एक TEXT प्रकार हमेशा डेटा को ब्लॉब में संग्रहित करेगा जबकि VARCHAR (MAX) प्रकार डेटा को पंक्ति में सीधे संग्रहीत करने का प्रयास करेगा जब तक कि यह 8k से अधिक न हो। सीमा और उस बिंदु पर यह एक बूँद में संग्रहीत करता है। " stackoverflow.com/questions/834788/… लेकिन सवाल MySQL के बारे में था, इसलिए यह वास्तव में यहाँ प्रासंगिक नहीं है।
स्टिगन बोलेन

9

आप URL का उपयोग कितनी बार किया जाएगा और क्या आपको वास्तव में अनबाउंड होने के लिए लंबाई की आवश्यकता के आधार पर एक पाठ या VARCHAR कॉलम के बीच चयन करना चाहते हैं ।

उपयोग VARCHAR maxlength साथ> = 2,083 के रूप में micahwittman अगर सुझाव:

  1. आप प्रति क्वेरी बहुत सारे URL का उपयोग करेंगे (पाठ कॉलम के विपरीत, VARCHARs पंक्ति के साथ इनलाइन संग्रहीत हैं)
  2. आपको पूरा यकीन है कि एक URL 65,535 बाइट्स की पंक्ति-सीमा से अधिक नहीं होगा।

TEXT का उपयोग करें यदि:

  1. URL वास्तव में 65,535 बाइट पंक्ति सीमा को तोड़ सकता है
  2. आपके प्रश्न एक ही बार (या बहुत बार) URL के एक समूह का चयन या अद्यतन नहीं करेंगे। इसका कारण यह है कि TEXT कॉलम केवल एक पॉइंटर इनलाइन को पकड़ते हैं, और संदर्भित डेटा को पुनः प्राप्त करने में शामिल यादृच्छिक अभिगम दर्दनाक हो सकते हैं।

9

आपको ASCII वर्ण एन्कोडिंग के साथ VARCHAR का उपयोग करना चाहिए। URL शत-प्रतिशत एन्कोडेड हैं और अंतर्राष्ट्रीय डोमेन नाम पंचर का उपयोग करते हैं इसलिए ASCII उन्हें संग्रहीत करने के लिए पर्याप्त है। यह UTF8 की तुलना में बहुत कम जगह का उपयोग करेगा।

VARCHAR(512) CHARACTER SET 'ascii' COLLATE 'ascii_general_ci' NOT NULL

5
क्या यूटीएफ -8 अधिक स्थान का उपयोग नहीं करता है जब उसे केवल करना होता है?
कोमराधोमर

7

यह वास्तव में आपके उपयोग के मामले पर निर्भर करता है (नीचे देखें), लेकिन TEXTप्रदर्शन के मुद्दों के रूप में संग्रहित है , और VARCHARअधिकांश मामलों के लिए ओवरकिल जैसा एक विशाल लगता है।

मेरा दृष्टिकोण: एक उदार का उपयोग करें, लेकिन अनुचित रूप से बड़ी VARCHARलंबाई, जैसे कि VARCHAR(500)या तो नहीं, और उन उपयोगकर्ताओं को प्रोत्साहित करें जिन्हें URL शोर्टनर का उपयोग करने के लिए बड़े URL की आवश्यकता है safe.mn

ट्विटर का दृष्टिकोण: वास्तव में अच्छा UX के लिए, URL के अत्यधिक लंबे समय के लिए एक स्वचालित URL शॉर्टनर प्रदान करें और लिंक के "प्रदर्शन संस्करण" को URL के स्निपेट के रूप में अंत में स्टोर करें। (उदाहरण: http://stackoverflow.com/q/219569/1235702प्रदर्शित किया stackoverflow.com/q/21956...जाएगा और एक छोटे URL से लिंक होगा http://ex.ampl/e1234)

नोट्स और कैविट्स

  • जाहिर है, ट्विटर का दृष्टिकोण अच्छा है, लेकिन मेरे ऐप की जरूरतों के लिए, एक URL शॉर्टनर की सिफारिश करना पर्याप्त था।
  • URL शॉर्टर्स में अपनी कमियां हैं, जैसे सुरक्षा चिंताएं। मेरे मामले में, यह एक बहुत बड़ा जोखिम नहीं है क्योंकि URL सार्वजनिक नहीं हैं और इसका भारी उपयोग नहीं किया गया है; हालाँकि, यह स्पष्ट रूप से सभी के लिए काम नहीं करेगा। safe.mn बहुत सारे स्पैम और फ़िशिंग URL को ब्लॉक करने के लिए प्रकट होता है, लेकिन मैं फिर भी सावधानी बरतने की सलाह दूंगा।
  • ध्यान रखें कि आप अपने उपयोगकर्ताओं को URL शॉर्टनर का उपयोग करने के लिए बाध्य न करें। अधिकांश मामलों के लिए (कम से कम मेरे ऐप की ज़रूरतों के लिए), 500 अक्षर अत्यधिक पर्याप्त हैं जो अधिकांश उपयोगकर्ता इसके लिए उपयोग कर रहे हैं। केवल लंबे-लंबे लिंक के लिए URL शॉर्टनर का उपयोग / अनुशंसा करते हैं।

10
यदि आप एक अंतर्निहित url शॉर्टनर प्रदान कर रहे हैं, तो क्या आपको अभी भी डेटाबेस में पूर्ण लंबाई के url को काम करने के लिए कहीं स्टोर करने की आवश्यकता नहीं है? :-)
नील नेमन

2
बेशक; लेकिन मुझे संदेह है कि ज्यादातर लोग अपने स्वयं के शॉर्टनर लिखेंगे। यह लिखने के बाद से, मैंने सीखा है कि वहाँ कई यूआरएल को छोटा करने वाले एपीआई हैं (71 यहां सूचीबद्ध हैं: programmableweb.com/news/… ), इसलिए आप अपना खुद का लिखे बिना भी इस प्रक्रिया को स्वचालित कर सकते हैं। यह अभी भी उपयोगकर्ता के ज्ञान और सहमति पर निर्भर करता है।
ब्रूकेथेलापेगैन

4

अधिकांश ब्राउज़र आपको एक URL में बहुत बड़ी मात्रा में डेटा डालने देंगे और इस प्रकार बहुत सारी चीज़ें बहुत बड़े URL का निर्माण करती हैं, इसलिए यदि आप किसी URL के डोमेन भाग से अधिक कुछ के बारे में बात कर रहे हैं, तो आपको TEXT कॉलम का उपयोग करना होगा VARCHAR / CHAR सीमित हैं


3

मैं अन्य ब्राउज़रों के बारे में नहीं जानता, लेकिन IE7 में HTTP GET संचालन के लिए 2083 वर्ण सीमा है । जब तक किसी भी अन्य ब्राउज़र की सीमाएँ कम नहीं होतीं, मैं यह नहीं देखता कि आपको 2083 से अधिक वर्णों की आवश्यकता क्यों होगी।


1

अधिकांश वेब सर्वरों की एक URL लंबाई सीमा होती है (यही कारण है कि "URI के लिए बहुत लंबा" एक त्रुटि कोड है), जिसका अर्थ है एक व्यावहारिक आकार है। सबसे लोकप्रिय वेब सर्वर के लिए डिफ़ॉल्ट लंबाई सीमा का पता लगाएं, और उनमें से सबसे बड़े का उपयोग क्षेत्र के अधिकतम आकार के रूप में करें; यह पर्याप्त से अधिक होना चाहिए।


1

आप varchar (max) का बेहतर उपयोग करते हैं (आकार के संदर्भ में) इसका मतलब है varchar (65535)। यह आपके बड़े वेब एड्रेस को भी स्टोर करेगा और आपके स्पेस को भी बचाएगा।

अधिकतम विनिर्देश varchar, nvarchar, और varbinary डेटा प्रकारों की भंडारण क्षमताओं का विस्तार करता है। varchar (अधिकतम), nvarchar (अधिकतम), और varbinary (अधिकतम) को सामूहिक रूप से बड़े-मूल्य डेटा प्रकार कहा जाता है। आप डेटा के 2 ^ 31-1 बाइट तक स्टोर करने के लिए बड़े-मूल्य वाले डेटा प्रकारों का उपयोग कर सकते हैं।

TechNet पर इस लेख को बड़े मूल्य डेटा प्रकारों का उपयोग करने के बारे में देखें


varchar (max)SQLServer सिंटैक्स है, जो MySQL (मूल प्रश्न के अनुसार) के लिए उपयुक्त नहीं है। इसके अलावा इसका मतलब यह नहीं है कि varchar (65535)65535 mysql में एक पंक्ति में ASCII वर्णों की अधिकतम संख्या है, इसलिए यह अन्य क्षेत्रों और चरित्र सेट पर भी निर्भर है।
फर्न्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.