سؤال

أريد إنشاء عمود Varchar في SQL الذي يجب أن يحتوي عليه N'guid' في حين guid هو guid المولدة بواسطة .NET (guid.newguid.) - نظام فئة.guid.

ما هو طول varchar يجب أن أتوقع من GUID؟ هل هو طول ثابت؟

هل ينبغي أن أستخدم nvarchar (هل سيستخدم GUID من أي وقت مضى أحرف Unicode)؟

varchar(Guid.Length)

ملاحظة. لا أريد استخدام نوع بيانات SQL صف البيانات. أنا فقط أسأل ما هو Guid.MaxLength.

هل كانت مفيدة؟

المحلول

ذلك يعتمد على كيفية تهيئة GUID:

  • 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}}

نصائح أخرى

36، وسوف تستخدم GUID فقط 0-9A-F (السداسي عشري!).

12345678-1234-1234-1234-123456789012

هذا هو 36 حرفا في أي GUID - فهي ذات طول ثابت. يمكنك قراءة المزيد قليلا عن تعقيدات GUIDs هنا.

ستحتاج إلى طولين آخرين إذا كنت ترغب في تخزين الأقواس.

ملاحظة: 36 هو طول السلسلة مع شرطات بينهما. هم في الواقع أرقام 16 بايت.

ال صيح الشيء الذي يجب القيام به هنا هو تخزينها uniqueidentifier - هذا ثم فهرسة بالكامل، إلخ. في قاعدة البيانات. سيكون الخيار التالي الأفضل binary(16) العمود: GUIDS القياسية هي بالضبط 16 بايت في الطول.

إذا كان يجب عليك تخزينها كسلسلة، فإن الطول يأتي حقا إلى كيفية اختيار ترميزه. كما ترميز Hex (AKA BASE-16) بدون الواصلات، سيكون 32 حرفا (رقمين عرافة لكل بايت)، لذلك char(32).

ومع ذلك، قد يريد لتخزين الواصلات. إذا كنت قصيرا على الفضاء، ولكن قاعدة البيانات الخاصة بك لا تدعم النقط / GUIDs أصلا، فيمكنك استخدامها base64. ترميز وإزالة == لاحقة الحشو. هذا يمنحك 22 حرفا، لذلك char(22). وبعد ليست هناك حاجة لاستخدام Unicode، ولا حاجة إلى طول المتغير - هكذا nvarchar(max) سيكون اختيار سيء، على سبيل المثال.

أعتقد أن GUIDs مقيدة بأطوال 16 بايت (أو 32 بايتا لمكافئة أسكي عرافة).

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)

:-)

22 بايت، إذا قمت بذلك مثل هذا:

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

Strings Strings Store بيانات البايت الخام، في حين نص سلاسل الأحرف متجر. استخدم البيانات الثنائية عند تخزين القيم العشرية HEXI مثل SID, GUID وما إلى ذلك وهلم جرا. يحتوي نوع بيانات UniqueDientifier على معرف فريد من نوعه، أو GUID. يتم اشتقاق هذه القيمة باستخدام وظيفة 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

ينطبق على: SQL Server يحتوي المثال التالي على جدول Cust Cost باستخدام نوع بيانات UniqueIdidifier، ويستخدم NETID لملء الجدول بقيمة افتراضية. عند تعيين القيمة الافتراضية NETYID ()، يحتوي كل صف جديد وحالي على قيمة فريدة لعمود CustomerID.

-- 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top