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

Я хочу создать столбец varchar в SQL, который должен содержать N'guid', а guid - сгенерированный GUID.NET(Guid.NewGuid) - class System.Guid.

Какова длина varchar, которую я должен ожидать от GUID? Это статическая длина?

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

varchar(Guid.Length)

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

Ответ 1

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

Ответ 2

36, а GUID будет использовать только 0-9A-F (hexidecimal!).

12345678-1234-1234-1234-123456789012

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

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

GUID - 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)

: -)

Ответ 6

22 байта, если вы сделаете это следующим образом:

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

Ответ 7

Двоичные строки хранят необработанные данные, а символьные строки хранят текст. Используйте двоичные данные при хранении шестнадцатеричных значений, таких как 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 Server В следующем примере создается таблица 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