জিইউডির স্ট্রিং দৈর্ঘ্য কত?


361

আমি এসকিউএল একটি varchar কলাম যে থাকা উচিত তৈরি করতে চান N'guid'যখন guid.NET দ্বারা একটি উত্পন্ন GUID (হয় Guid.NewGuid বর্গ System.Guid -)।

varcharজিইউইডের কাছ থেকে আমার দৈর্ঘ্যের কতটা আশা করা উচিত? এটি কি স্থির দৈর্ঘ্য?

আমার কি ব্যবহার করা উচিত nvarchar(জিইউডি কি কখনও ইউনিকোডের অক্ষর ব্যবহার করবে)?

varchar(Guid.Length)

পুনশ্চ. আমি কোনও এসকিউএল সারি নির্দেশিকা ডেটা-টাইপ ব্যবহার করতে চাই না। আমি শুধু কি জিজ্ঞাসা করছি Guid.MaxLength


1
দ্রষ্টব্য: Guid.NewGuidএর অন্তর্নিহিত "স্ট্রিং দৈর্ঘ্য" নেই; এটি সমস্তই ToString এ ব্যবহৃত বিন্যাসের উপর নির্ভর করে (নো-আর্গুমেন্ট ToString"ডি" ফর্ম্যাটিং ব্যবহার করে)। আমি "বি" কে বেশি পছন্দ করি কারণ এটি "এটি একটি জিইউআইডি" দেখতে সহজ, তবে এটি কেবল পরিচিতি এবং সম্মেলন।

8
কেন এটি কেবল 16 বাইটের অনন্য পরিচয় হিসাবে সংরক্ষণ করবেন না?
ফিলিপ কর্নেলিসসেন

উত্তর:


769

আপনি গাইডকে কীভাবে ফর্ম্যাট করবেন তা নির্ভর করে:

  • Guid.NewGuid().ToString()=> 36 টি অক্ষর (হাইফেনেটেড)
    আউটপুট:12345678-1234-1234-1234-123456789abc

  • Guid.NewGuid().ToString("D")=> 36 টি অক্ষর (হাইফেনেটেড, একই হিসাবে ToString())
    আউটপুট:12345678-1234-1234-1234-123456789abc

  • Guid.NewGuid().ToString("N")=> 32 টি অক্ষর (কেবলমাত্র অঙ্ক)
    আউটপুট:12345678123412341234123456789abc

  • Guid.NewGuid().ToString("B")=> 38 টি অক্ষর (বন্ধনী)
    আউটপুট:{12345678-1234-1234-1234-123456789abc}

  • Guid.NewGuid().ToString("P")=> 38 টি অক্ষর (প্যারেন্টেসিস)
    আউটপুট:(12345678-1234-1234-1234-123456789abc)

  • Guid.NewGuid().ToString("X")=> 68 টি অক্ষর (হেক্সাডেসিমাল)
    আউটপুট:{0x12345678,0x1234,0x1234,{0x12,0x34,0x12,0x34,0x56,0x78,0x9a,0xbc}}


1
@ শিমি - প্রথমটি দেখুন 'হাইপেনেটেড, ডিফল্ট হিসাবে একই'
স্টিভিওপওয়েল

2
ওহ, তাহলে এটি এইচ এর সাথে 'হাইফেন' (আমি
অভিধানটি দেখছিলাম এবং হাইপেনটি সন্ধান

24
আমি যুক্ত করতে চাই যে একটি গাইড হল 128-বিট স্বাক্ষরযুক্ত স্বাক্ষর পূর্ণসংখ্যা। আপনি এটি 16-বাইট অ্যারের হিসাবেও সঞ্চয় করতে পারেন byte[16]
এরিক ফলসকেন

3
পিএস, অন্য বিকল্প রয়েছে: গাইড.নিউইউজিড ()। টুস্ট্রিং ("এক্স") => 68 টি অক্ষরের আউটপুট: {0x12345678,0x1234,0x1234, x 0x12,0x23,0x12,0x34,0x56,0x78,0x9a, 0xbc}}
ফিলিপ কর্নেলিসসেন

4
"কেবলমাত্র" সংখ্যাটি "এন" বিকল্পের সাথে মন্তব্য করা কিছুটা জটিল! আপনার এটি বন্ধনী এবং হাইফেন ছাড়া যেমন পড়তে হবে
জোভেন

63

36, এবং জিইউইডি কেবল 0-9A-F (হেক্সিডিসিমাল!) ব্যবহার করবে।

12345678-1234-1234-1234-123456789012

এটি কোনও জিইউডিতে 36 টি অক্ষর - এগুলি ধ্রুবক দৈর্ঘ্যের। আপনি GUIDs এর intricacies সম্পর্কে একটু আরও পড়তে পারেন এখানে

যদি আপনি বন্ধনীগুলি সঞ্চয় করতে চান তবে আপনার আরও দুটি দৈর্ঘ্যের প্রয়োজন হবে।

দ্রষ্টব্য: 36 এর মধ্যে ড্যাশগুলির সাথে স্ট্রিং দৈর্ঘ্য। এগুলি আসলে 16-বাইট নম্বর।


1
আমি মনে করি একটি শ্রদ্ধা {with এর সাথে ঘিরে রয়েছে, যার অর্থ সর্বোচ্চ 38 হবে
মিচ হুইট

3
আমি বেশ নিশ্চিত যে আপনি এটি প্রথমবার পেয়েছিলেন, এরিক। গাইড। টুস্ট্রিং () 36 টি দৈর্ঘ্যের একটি স্ট্রিং দেয়, কোনও ধনুবন্ধনী ছাড়াই।
মাইকেল পেট্রোটা

আপনার দুজনের জন্য ধন্যবাদ, আমার যা প্রয়োজন তা হ'ল 36, আমি বলেছিলাম আমি গাইড সঞ্চয় করতে চাই e নিউগুইড।
শিমি ওয়েইজস্যান্ডলার

7
এটি নেট। এর পক্ষে ভুল; আপনি কেবল 36 অক্ষর পাবেন! আপনি সি # ভিজ্যুয়ালাইজারের জন্য ব্রেসগুলি (38 টি অক্ষর) পান তবে কোডে নয়!
স্টিভিপওয়েল

আমি পেডেন্টিক হচ্ছি, তবে শেষ 3 টি সংখ্যাটি এবিসি হতে পারে। আপনি সত্যিই এখানে একটি সুযোগ মিস করেছেন।
এনএইচ।

32

এখানে সঠিক কাজটি হ'ল এটি সংরক্ষণ করুন uniqueidentifier- এটি তখন সম্পূর্ণ ডাটাবেজে সূচকযোগ্য ইত্যাদি। পরবর্তী সেরা বিকল্পটি একটি binary(16)কলাম হবে: মানক জিইউইডিগুলি দৈর্ঘ্যে হ'ল 16 বাইট।

আপনি যদি এটি অবশ্যই একটি স্ট্রিং হিসাবে সংরক্ষণ করতে পারেন তবে আপনি কীভাবে এটি এনকোড করতে চান তার দৈর্ঘ্যটি আসলে নেমে আসে। হিসাবে হেক্স (ওরফে বেস-16 এনকোডিং) হাইফেন ছাড়া 32 অক্ষর (বাইট প্রতি দুই হেক্স সংখ্যার) হবে, তাই char(32)

তবে আপনি হাইফেনগুলি সঞ্চয় করতে পারেন । আপনি যদি স্থানটিতে স্বল্প হন তবে আপনার ডাটাবেসগুলি ব্লব / গাইডগুলিকে স্থানীয়ভাবে সমর্থন করে না, আপনি বেস 64 এনকোডিং ব্যবহার করতে পারেন এবং ==প্যাডিং প্রত্যয়টি সরিয়ে ফেলতে পারেন ; যে আপনি 22 অক্ষর দেয়, তাই char(22)। ইউনিকোড ব্যবহার করার প্রয়োজন নেই, এবং ভেরিয়েবল-দৈর্ঘ্যের প্রয়োজন নেই - nvarchar(max)উদাহরণস্বরূপ, এটি একটি খারাপ পছন্দ হবে।


কেন uniqueidentiferপুরোপুরি সূচকযোগ্য তবে binary(16)তা নয়?
বাল্টোস্টার

9

আমি বিশ্বাস করি জিইউইডিগুলি 16-বাইট দৈর্ঘ্যের (বা একটি এএসসিআইআই হেক্স সমতুল্যে 32 বাইট) সীমাবদ্ধ।


5

জিইউইডিগুলি হ'ল 128 বেট, বা

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)

:-)


তত্ত্বগতভাবে, হ্যাঁ তবে আজকের বিশাল হার্ড ডিস্কের সাথে, বারচর (50) এর মতো কিছু ব্যবহার করা আরও বেশি ব্যবহারিক। সুতরাং আপনি যদি '1234ABC-ABCD-12AB-34CD-FEDCBA12' এর মতো কিছু সঞ্চয় করেন তবে আপনাকে এটি অনুবাদ করতে পিছনে পিছনে যেতে হবে না। আপনি যা পরামর্শ দিচ্ছেন তা হ'ল মূল্য পড়ার / লেখার চেয়ে কিছুটা বেশি সিপিইউ নিবিড়, যা আপনি অনুশীলনে চান।
লংচ্যাক

3

22 বাইট, যদি আপনি এটি এটি করেন:

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

0

বাইনারি স্ট্রিংগুলি কাঁচা-বাইট ডেটা সঞ্চয় করে, অক্ষরের স্ট্রিংগুলি পাঠ্য সঞ্চয় করে। হেক্সি-দশমিক মানগুলি যেমন SID, ইত্যাদি সঞ্চয় করার সময় বাইনারি ডেটা ব্যবহার GUIDকরুন। অনন্য পরিচয়কারী ডেটা ধরণের একটি বিশ্বব্যাপী অনন্য সনাক্তকারী, বা জিইউডি রয়েছে। এই মানটি নিউজ () ফাংশনটি ব্যবহার করে সমস্ত বস্তুর কাছে অনন্য value এটি বাইনারি মান হিসাবে সঞ্চিত তবে এটি একটি অক্ষরের স্ট্রিং হিসাবে প্রদর্শিত হয়।

এখানে একটি উদাহরণ।

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 ব্যবহার করে। 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

অতিরিক্ত আইডি আইটি আইটি আইটি আইটি আইটি পরিচয় (১,১) ব্যবহার করার চেয়ে কিছুটা বেশি পছন্দসই প্রাথমিক কী মূল প্রাইমারি কী ছাড়াই একটি টেবিলটি সমস্যাকে আমন্ত্রণ জানায়। মনে করুন আপনার মিলিয়ন গ্রাহক এবং আপনি একটি একক লাইন চান - যেখানে গ্রাহকআইডি = 'এক্সএক্সএক্সএক্সএক্স' - আপনি পুরো টেবিলটি স্ক্যান করতে চান বা সরাসরি এটি সন্ধান করতে চান? এই দ্বৈত অনুসন্ধান - আইডি = 524332 এবং গ্রাহকআইডি = 'এক্সএক্সএক্সএক্স' একটি খুব শক্তিশালী অনুসন্ধান। এটি উভয়ই খুব দ্রুত এবং খুব সুরক্ষিত (কেউই ব্রুট ফোর্স সহ কোনও জিইউইডিকে অনুমান করতে পারে না)।
লংচ্যাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.