2009-06-09 13 views
261

मैं एसक्यूएल में वर्चर कॉलम बनाना चाहता हूं जिसमें N'guid' होना चाहिए जबकि guid .NET (Guid.NewGuid) - क्लास सिस्टम.गुइड द्वारा जेनरेट किया गया GUID है।GUID की स्ट्रिंग लंबाई क्या है?

varchar की लंबाई क्या है मुझे एक GUID से उम्मीद करनी चाहिए? क्या यह एक स्थिर लंबाई है?

क्या मुझे nvarchar का उपयोग करना चाहिए (क्या GUID कभी यूनिकोड वर्णों का उपयोग करेगा)?

varchar(Guid.Length) 

पीएस। मैं एक एसक्यूएल पंक्ति गाइड डेटा प्रकार का उपयोग नहीं करना चाहता। मैं सिर्फ पूछ रहा हूं कि Guid.MaxLength क्या है।

+1

नोट: 'Guid.NewGuid' का कोई अंतर्निहित "स्ट्रिंग लम्बाई" नहीं है; यह सब [ToString] (http://msdn.microsoft.com/en-us/library/97af8hh4.aspx) में उपयोग किए गए प्रारूप पर निर्भर करता है (कोई तर्क नहीं 'ToString' "D" स्वरूपण का उपयोग करता है)। मैं "बी" पसंद करता हूं क्योंकि यह देखना आसान है कि "यह एक GUID है", लेकिन यह सिर्फ परिचितता और सम्मेलन है। –

+6

क्यों इसे 16byte अद्वितीय पहचानकर्ता के रूप में सहेजें नहीं? –

उत्तर

576

यह आप कैसे प्रारूप पर Guid निर्भर करता है:

  • Guid.NewGuid().ToString() => वर्ण (बंटे)
    आउटपुट: 12345678-1234-1234-1234-123456789abc

  • Guid.NewGuid().ToString("D") => वर्ण (बंटे, ToString() के समान)
    आउटपुट: 12345678-1234-1234-1234-123456789abc

  • Guid.NewGuid().ToString("N") => वर्ण (अंक केवल)
    आउटपुट: 12345678123412341234123456789abc

  • Guid.NewGuid().ToString("B") => वर्ण (ब्रेसिज़)
    आउटपुट: {12345678-1234-1234-1234-123456789abc}

  • Guid.NewGuid().ToString("P") => अक्षर (अभिभावक)
    आउटपुट: (12345678-1234-1234-1234-123456789abc)

  • Guid.NewGuid().ToString("X") => वर्ण (हेक्साडेसिमल)
    आउटपुट: - इस तो है {0x12345678,0x1234,0x1234,{0x12,0x34,0x12,0x34,0x56,0x78,0x9a,0xbc}}

+1

@Shimmy - पहले को 'हाइपेनेटेड, डिफ़ॉल्ट के समान ही देखें' – stevehipwell

+0

मुझे नहीं पता कि अतिसंवेदनशील अर्थ क्या हैं :( – Shimmy

+0

@Shimmy - समूहों को अलग करने के लिए एक हाइफ़न वर्ण '-' का उपयोग किया जाता है। – stevehipwell

53

36, और GUID केवल 0-9A-F (हेक्साइडसिमल!) का उपयोग करेगा।

12345678-1234-1234-1234-123456789012

किसी भी GUID में 36 वर्णों के - वे निरंतर लंबाई के होते हैं। आप GUIDs here की जटिलताओं के बारे में कुछ और पढ़ सकते हैं।

यदि आप ब्रेसिज़ को स्टोर करना चाहते हैं तो आपको दो और लम्बाई की आवश्यकता होगी।

नोट: 36 बीच में डैश के साथ स्ट्रिंग लंबाई है। वे वास्तव में 16-बाइट संख्या हैं।

+1

मुझे लगता है कि एक अवशोषण {} से घिरा हुआ है, तो इसका मतलब अधिकतम 38 –

+3

होगा, मुझे पूरा यकीन है कि आपने पहली बार यह सही किया था, एरिक। guid.ToString() कोई ब्रेसिज़ के साथ लंबाई 36 की एक स्ट्रिंग देता है। –

+0

आपके लिए धन्यवाद दो, मुझे जो चाहिए वह 36 है, मैंने कहा कि मैं Guid.NewGuid स्टोर करना चाहता हूं। – Shimmy

8

मेरा मानना ​​है कि GUID 16-बाइट लंबाई (या ASCII हेक्स समकक्ष के लिए 32 बाइट्स) तक सीमित हैं।

21

सही यहाँ करने के लिए बात uniqueidentifier के रूप में यह स्टोर करने के लिए है डेटाबेस में पूरी तरह अनुक्रमणीय, आदि। अगला सबसे अच्छा विकल्प binary(16) कॉलम होगा: मानक GUID लंबाई में 16 बाइट्स हैं।

यदि आपको इसे एक स्ट्रिंग के रूप में स्टोर करना होगा, तो लंबाई वास्तव में नीचे आती है कि आप इसे एन्कोड करना चुनते हैं। हेक्सेंस के बिना हेक्स (एकेए बेस -16 एन्कोडिंग) के रूप में यह 32 वर्ण (प्रति हेक्टेयर दो हेक्टेयर अंक) होगा, इसलिए char(32)

हालांकि, आप हाइफ़न स्टोर करने के लिए चाहते हैं। यदि आप अंतरिक्ष पर कम हैं, लेकिन आपका डेटाबेस ब्लॉब्स/गइड्स को मूल रूप से समर्थन नहीं देता है, तो आप Base64 एन्कोडिंग का उपयोग कर सकते हैं और == पैडिंग प्रत्यय को हटा सकते हैं; जो आपको 22 वर्ण देता है, इसलिए char(22)। यूनिकोड का उपयोग करने की कोई आवश्यकता नहीं है, और चर-लंबाई की आवश्यकता नहीं है - इसलिए nvarchar(max) एक खराब विकल्प होगा, उदाहरण के लिए।

3

GUIDs 128bits कर रहे हैं, या

0 through ffffffffffffffffffffffffffffffff (hex) or 
0 through 340282366920938463463374607431768211455 (decimal) or 
0 through 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 (binary, base 2) or 
0 through 91"<b.PX48m!wVmVA?1y (base 95) 

तो हाँ, लंबे समय मिनट 20 वर्ण, जो वास्तव में 4 से अधिक बर्बाद कर रहा है।25 बिट्स, तो आप 95 से भी छोटे अड्डों का उपयोग करके उतना ही कुशल हो सकते हैं; आधार 85 किया जा रहा है छोटी संभव है कि अभी भी 20 वर्ण में फिट बैठता है:

0 through -r54lj%NUUO[Hi$c2ym0 (base 85, using 0-9A-Za-z!"#$%&'()*+,- chars) 

:-)

1

22 बाइट्स, यदि आप इसे इस तरह से कार्य करें:

System.Guid guid = System.Guid.NewGuid(); 
byte[] guidbytes = guid.ToByteArray(); 
string uuid = Convert.ToBase64String(guidbytes).Trim('='); 
0

द्विआधारी तार raw- की दुकान बाइट डेटा, जबकि चरित्र तार स्टोर पाठ। SID, GUID जैसे हेक्सी-दशमलव मानों को संग्रहीत करते समय बाइनरी डेटा का उपयोग करें और इसी तरह। अद्वितीय पहचानकर्ता डेटा प्रकार में एक वैश्विक रूप से अद्वितीय पहचानकर्ता, या GUID शामिल है। यह मान सभी वस्तुओं के लिए अद्वितीय मान को वापस करने के लिए NEWID() फ़ंक्शन का उपयोग कर लिया गया है। यह एक बाइनरी मान के रूप में संग्रहीत है लेकिन यह एक चरित्र स्ट्रिंग के रूप में प्रदर्शित किया जाता है।

यहां एक उदाहरण है। एसक्यूएल सर्वर निम्न उदाहरण एक uniqueidentifier डेटा प्रकार के साथ ग्राहक तालिका बनाता है, और एक डिफ़ॉल्ट मान के साथ तालिका भरने के लिए NEWID उपयोग करता है:

USE AdventureWorks2008R2; 
GO 
CREATE TABLE MyCcustomerTable 
(
    user_login varbinary(85) DEFAULT SUSER_SID() 
    ,data_value varbinary(1) 
); 
GO 

INSERT MyCustomerTable (data_value) 
    VALUES (0x4F); 
GO 

पर लागू होता है। NEWID() के डिफ़ॉल्ट मान को निर्दिष्ट करने में, प्रत्येक नई और मौजूदा पंक्ति में ग्राहक आईडी कॉलम के लिए एक अद्वितीय मान होता है।

-- Creating a table using NEWID for uniqueidentifier data type. 
CREATE TABLE cust 
( 
CustomerID uniqueidentifier NOT NULL 
    DEFAULT newid(), 
Company varchar(30) NOT NULL, 
ContactName varchar(60) NOT NULL, 
Address varchar(30) NOT NULL, 
City varchar(30) NOT NULL, 
StateProvince varchar(10) NULL, 
PostalCode varchar(10) NOT NULL, 
CountryRegion varchar(20) NOT NULL, 
Telephone varchar(15) NOT NULL, 
Fax varchar(15) NULL 
); 
GO 
-- Inserting 5 rows into cust table. 
INSERT cust 
(CustomerID, Company, ContactName, Address, City, StateProvince, 
PostalCode, CountryRegion, Telephone, Fax) 
VALUES 
(NEWID(), 'Wartian Herkku', 'Pirkko Koskitalo', 'Torikatu 38', 'Oulu', NULL, 
'90110', 'Finland', '981-443655', '981-443655') 
,(NEWID(), 'Wellington Importadora', 'Paula Parente', 'Rua do Mercado, 12', 'Resende', 'SP', 
'08737-363', 'Brasil', '(14) 555-8122', '') 
,(NEWID(), 'Cactus Comidas para Ilevar', 'Patricio Simpson', 'Cerrito 333', 'Buenos Aires', NULL, 
'1010', 'Argentina', '(1) 135-5555', '(1) 135-4892') 
,(NEWID(), 'Ernst Handel', 'Roland Mendel', 'Kirchgasse 6', 'Graz', NULL, 
'8010', 'Austria', '7675-3425', '7675-3426') 
,(NEWID(), 'Maison Dewey', 'Catherine Dewey', 'Rue Joseph-Bens 532', 'Bruxelles', NULL, 
'B-1180', 'Belgium', '(02) 201 24 67', '(02) 201 24 68'); 
GO 
संबंधित मुद्दे