Какова длина строки GUID? - PullRequest
320 голосов
/ 09 июня 2009

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

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

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

varchar(Guid.Length)

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

Ответы [ 7 ]

690 голосов
/ 16 декабря 2010

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

62 голосов
/ 09 июня 2009

36, и GUID будет использовать только 0-9A-F (шестнадцатеричный!).

12345678-1234-1234-1234-123456789012

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

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

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

27 голосов
/ 14 октября 2014

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

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

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

9 голосов
/ 09 июня 2009

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

5 голосов
/ 29 октября 2015

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)

: -)

3 голосов
/ 20 января 2017

22 байта, если вы сделаете это так:

System.Guid guid = System.Guid.NewGuid();
byte[] guidbytes = guid.ToByteArray();
string uuid = Convert.ToBase64String(guidbytes).Trim('=');
0 голосов
/ 07 октября 2017

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