2008-10-20 17 views
271

के लिए सर्वश्रेष्ठ डेटाबेस फ़ील्ड प्रकार मुझे एक MySQL तालिका में एक यूआरएल स्टोर करने की आवश्यकता है। एक ऐसे क्षेत्र को परिभाषित करने के लिए सबसे अच्छा अभ्यास क्या है जो एक अनिश्चित लंबाई वाले यूआरएल को पकड़ लेगा?एक यूआरएल

+1

यह आपको क्या चाहिए, अनुक्रमण, यूनिकिटी पर निर्भर करता है? –

उत्तर

257
  1. Lowest common denominator max URL length among popular web browsers: 2,083 (Internet Explorer)

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

  3. तो ...
    < MySQL 5.0.3 उपयोग पाठ
    या
    > = MySQL 5.0.3 उपयोग VARCHAR (2083)

+12

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

+2

वे बेहतर यूरी डेटाटाइप के साथ आएंगे जो यूरी की संरचना को "समझता है" ताकि इंडेक्सिंग और सर्च कुशलता से की जा सके, जैसे ऑरैकल ... प्रतीक्षा करें, mysql अब ऑरैकल है ... http: // डाउनलोड .oracle.com/दस्तावेज़/सीडी/बी 10464_05/web.904/b12099/adx06uri.htm – redben

+53

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

32

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

+0

collation के बारे में क्या? – kommradHomer

14

MySQL 5.0.3 के लिए SQLServer2005

varchar(65535) के लिए varchar(max) और बाद में

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

+1

आपके स्निपेट में, VAXAR आकार को आवश्यकतानुसार बढ़ाने के लिए एक जादू एएनएसआई एसक्यूएल विनिर्देशक है, या उदाहरण के लिए यह केवल मेटा-वेरिएबल है? –

+1

यह एक SQL2005 वाक्यविन्यास है। संपादन । । । –

+4

MySQL में आपको संभवतः एक वर्चर नहीं हो सकता है जब तक कि यह तालिका में एकमात्र स्तंभ न हो। – carson

4

अधिकतर ब्राउज़र आपको very large amounts of data in a URL और इस तरह बातें की बहुत सारी अंत बहुत बड़ी यूआरएल बनाने इसलिए यदि आप एक यूआरएल आप VARCHAR/CHAR are limited के बाद से एक पाठ स्तंभ का उपयोग करने की आवश्यकता होगी के डोमेन भाग से अधिक कुछ के बारे में बात कर रहे हैं डाल करने देगा।

3

मुझे अन्य ब्राउज़रों के बारे में पता नहीं है, लेकिन IE7 has a 2083 character limit for HTTP GET operations। जब तक कि किसी अन्य ब्राउज़र की सीमा कम न हो, मुझे नहीं लगता कि आपको 2083 से अधिक वर्णों की आवश्यकता क्यों होगी।

0

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

1

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

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

TechNet पर this article देखें बड़े मूल्य डेटा प्रकार

+0

'वर्कर (अधिकतम) 'एसक्यूएलसेवर सिंटैक्स है, जो MySQL (मूल प्रश्न के रूप में) के लिए उपयुक्त नहीं है। इसके अलावा इसका मतलब यह नहीं है कि वर्चर (65535) '65535 के बाद से MySQL में एक पंक्ति में ASCII वर्णों की अधिकतम संख्या है, इसलिए यह अन्य क्षेत्रों और चरित्र सेट पर भी निर्भर है। – furins

6

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

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

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

उपयोग पाठ यदि:

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

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

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

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

  • जाहिर

    नोट्स और चेतावनियां, ट्विटर दृष्टिकोण, अच्छे है, लेकिन मेरे ऐप की जरूरतों के लिए, एक यूआरएल की सिफारिश शॉर्टनर पर्याप्त था।

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

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

+0

बेशक; लेकिन मुझे संदेह है कि ज्यादातर लोग अपना खुद का शॉर्टनर लिखेंगे। इसे लिखने के बाद, मैंने सीखा है कि वहां कई यूआरएल शॉर्टिंग एपीआई हैं (71 यहां सूचीबद्ध हैं: http://www.programmableweb.com/news/71-url-shortener-apis-bit.ly-google-url -शॉर्टनर-एंड-टिनी-यूआरएल-ओपन/2012/10/31), ताकि आप अपनी खुद की लेखन किए बिना प्रक्रिया को स्वचालित कर सकें। यह अभी भी उपयोगकर्ता ज्ञान और सहमति पर निर्भर करता है। – CullenJ

7

आपको एएससीआईआईआई चरित्र एन्कोडिंग के साथ एक वचरर का उपयोग करना चाहिए। यूआरएल प्रतिशत एन्कोडेड हैं और अंतरराष्ट्रीय डोमेन नाम punycode का उपयोग करते हैं ताकि ASCII उन्हें स्टोर करने के लिए पर्याप्त हो। यह यूटीएफ 8 की तुलना में बहुत कम जगह का उपयोग करेगा।

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

क्या यूटीएफ -8 अधिक जगह का उपयोग नहीं करता है जब इसे केवल करना पड़ता है? – kommradHomer

संबंधित मुद्दे