Вопрос

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

Какова длина varchar Чего мне ожидать от GUID?Это статическая длина?

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

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 — они имеют постоянную длину.Вы можете прочитать немного больше о тонкостях GUID. здесь.

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

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

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

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

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

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

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)

:-)

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 Server Следующий пример создает таблицу CUST с уникальным типом данных и использует 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top