Какова длина строки GUID?


Я хочу создать столбец varchar в SQL, который должен содержать N'guid' во время guid - это идентификатор GUID, сгенерированный по .Чистый (Guid.Метод newguid) - системы класса.идентификатор GUID.

какова длина varchar Я должен ожидать от GUID? Это статическая длина?

Я должен использовать nvarchar (будет ли GUID когда-либо использовать символы Юникода)?

varchar(Guid.Length)

PS. Я не хочу использовать тип данных guid строки SQL. Я просто спрашиваю, Что такое Guid.MaxLength.

7 288

7 ответов:

это зависит от того, как вы форматируете 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-11234-1234-1234-123456789012

это 36 символов в любом GUID-они имеют постоянную длину. Вы можете прочитать немного больше о тонкостях GUIDs здесь.

вам понадобится еще два в длину, если вы хотите сохранить фигурные скобки.

Примечание: 36-это длина строки с тире между ними. На самом деле это 16-байтовые числа.

The правильно здесь нужно хранить его как uniqueidentifier - это тогда полностью индексируется и т. д. в базе данных. Следующий-лучший вариант будет binary(16) столбец: стандартные идентификаторы GUID имеют длину ровно 16 байт.

если вы должны хранить его в виде строки, длина действительно сводится к тому, как вы решите его кодировать. Как hex (aka base-16 encoding) без дефисов это будет 32 символа (две шестнадцатеричные цифры на байт), так char(32).

тем не менее, вы можете хочу сохранить дефисы. Если вам не хватает места, но ваша база данных не поддерживает blobs / GUID изначально, вы можете использовать Base64 кодирование и удаление == дополняющий суффикс; это дает вам 22 символа, так что char(22). Там нет необходимости использовать Unicode, и нет необходимости в переменной длины-так nvarchar(max) был бы плохой выбор, например.

Я считаю, что GUID ограничены длиной 16 байт (или 32 байта для шестнадцатеричного эквивалента ASCII).

GUID 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('=');

двоичные строки хранят необработанные байтовые данные, в то время как символьные строки хранят текст. Используйте двоичные данные при хранении шестнадцатеричных значений, таких как SID,GUID и так далее. Тип данных uniqueidentifier содержит глобальный уникальный идентификатор или 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-сервер В следующем примере создается таблица cust с типом данных uniqueidentifier и используется NEWID для заполнения таблицы значением по умолчанию. При назначении значения по умолчанию NEWID () каждая новая и существующая строка имеет уникальное значение для столбца 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