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


363

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

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

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

varchar(Guid.Length)

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


1
Примечание: Guid.NewGuidне имеет неявной «длины строки»; Все зависит от формата, используемого в ToString (без аргументов ToStringиспользуется форматирование "D"). Я предпочитаю «B», поскольку легче «увидеть, что это GUID», но это просто знакомство и условность.

8
почему бы просто не сохранить его как 16-байтовый уникальный идентификатор?
Филип Корнелиссен

Ответы:


771

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


1
@Shimmy - Посмотрите на первый «Hypenated, то же самое, что и по умолчанию»
stevehipwell

2
О, тогда это 'Дефис' с H (я искал в словаре и не смог найти гипс) ... Спасибо
Шимми Вайцхандлер

25
Я хотел бы добавить, что Guid - это 128-разрядное целое число без знака. Вы также можете сохранить его как 16-байтовый массив byte[16].
Эрик Фальскен

4
ps, есть еще одна опция: Guid.NewGuid (). ToString ("X") => 68 символов вывода: {0x12345678,0x1234,0x1234, {0x12,0x23,0x12,0x34,0x56,0x78,0x9a, 0xbc}}
Филип Корнелиссен

4
комментарий об «только цифрах» с опцией «N» немного хитрый! Вы должны прочитать это как без скобок и дефисов
Jowen

65

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

12345678-1234-1234-1234-123456789012

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

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

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


1
Я думаю, что одна репрезентация окружена {}, так что это будет означать максимум 38
Mitch Wheat

3
Я почти уверен, что с первого раза все получилось, Эрик. guid.ToString () возвращает строку длиной 36 без скобок.
Майкл Петротта

Спасибо вам двоим, мне нужно 36, я сказал, что хочу сохранить Guid.NewGuid.
Шимми Вайцхандлер

7
Это неправильно для .NET; вы получите только 36 символов! Вы получите скобки (38 символов) для визуализатора C #, но не в коде!
Stevehipwell

Я педантичен, но последние 3 цифры могли быть азбукой. Вы действительно упустили возможность здесь.
НХ.

32

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

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

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


почему uniqueidentiferполностью индексируется, а binary(16)нет?
BaltoStar

9

Я считаю, что 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)

:-)


В теории да. Но с огромными жесткими дисками сегодня гораздо практичнее использовать что-то вроде varchar (50). Поэтому, если вы храните что-то вроде «1234ABC-ABCD-12AB-34CD-FEDCBA12», вам не нужно переходить туда-сюда в переводе. То, что вы предлагаете, немного больше загружает процессор, чем просто чтение / запись значения, чего вы и хотите на практике.
LongChalk

3

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

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

0

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

Несколько предпочтительнее использовать дополнительный идентификатор int identity (1,1) PRIMARY KEY Таблица без первичного ключа вызывает проблемы. Предположим, у вас есть миллион клиентов, и вы хотите одну строку - ГДЕ CustomerID = 'xxx' - вы хотите отсканировать всю таблицу или искать ее напрямую? Этот двойной поиск - ID = 524332 и CustomerID = 'xxx' - очень сильный поиск. Это и очень быстро, и очень безопасно (никто не может угадать GUID с помощью грубой силы).
LongChalk
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.