Яка довжина рядка GUID?


361

Я хочу створити в SQL стовпець varchar, який повинен містити в N'guid'той час guid, як генерується GUID у .NET ( Guid.NewGuid ) - клас System.Guid.

Яку тривалість varcharя повинен очікувати від GUID? Це статична довжина?

Чи повинен я використовувати nvarchar(чи буде GUID коли-небудь використовувати символи Unicode)?

varchar(Guid.Length)

PS. Я не хочу використовувати тип даних даних про лінійку SQL. Я просто запитую, що таке Guid.MaxLength.


1
Примітка: Guid.NewGuidне має неявної "довжини рядка"; Все залежить від формату, який використовується у ToString (Аргумент без аргументу ToStringвикористовує "D" форматування). Я віддаю перевагу "B", оскільки легше "бачити, що це GUID", але це лише знайомство та умовність.

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

Відповіді:


769

Це залежить від того, як ви форматуєте Посібник:

  • 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 - Подивіться на першу «Гіпенізовану, те саме, що за замовчуванням»
stevehipwell

2
О, тоді це "Дефіс" з Н (я шукав у словнику і не зміг знайти гіпена) ... Дякую
Shimmy Weitzhandler

24
Я хотів би додати, що Guid - це 128-бітове непідписане ціле число. Ви також можете зберігати його як 16-байтовий масив byte[16].
Ерік Фальскен

3
ps, є інший варіант: Guid.NewGuid (). ToString ("X") => 68 виходів символів: {0x12345678,0x1234,0x1234, {0x12,0x23,0x12,0x34,0x56,0x78,0x9a, 0xbc}}
Філіп Корнеліссен

4
коментар про "лише цифри" з опцією "N" трохи складний! Ви повинні прочитати це як без дужок і дефісів
Джовен

63

36, і GUID використовуватиме лише 0-9A-F (дванадцятимісний!).

12345678-1234-1234-1234-123456789012

Це 36 символів у будь-якому GUID - вони мають постійну довжину. Ви можете прочитати трохи більше про тонкощі GUID тут .

Вам потрібно буде ще дві довжини, якщо ви хочете зберігати брекети.

Примітка: 36 - довжина рядка з тиреми між ними. Вони насправді є 16-байтними числами.


1
Я думаю, що одна презентація оточує {}, так що це означатиме максимум 38
Mitch Wheat

3
Я впевнений, що ви вперше це зробили, Ерік. guide.ToString () повертає рядок довжиною 36, без дужок.
Майкл Петротта

Дякую вам, що мені знадобиться 36, я сказав, що хочу зберігати Guid.NewGuid.
Шиммі Вайцхандлер

7
Це неправильно для .NET; ви отримуєте лише 36 символів! Ви отримуєте дужки (38 символів) для візуалізатора C #, але не в коді!
stevehipwell

Я буду педантичним, але останні три цифри могли бути ABC. Ви тут справді пропустили нагоду.
NH.

32

Правильно , що потрібно зробити тут , щоб зберегти його як uniqueidentifier- це те повністю індексується і т.д. в базі даних. Наступним найкращим варіантом буде binary(16)стовпець: стандартні GUID мають рівно 16 байт.

Якщо ви повинні зберігати його як рядок, довжина дійсно зводиться до того, як ви вирішите кодувати його. Як шістнадцятковий (кодування AKA base-16) без дефісів, це було б 32 символи (дві шістнадцяткові цифри на байт), так char(32).

Однак, можливо, ви захочете зберігати дефіси. Якщо у вас не вистачає місця, але ваша база даних не підтримує краплі / путівки, ви можете використовувати кодування 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і так далі. Тип даних унікального ідентифікатора містить глобальний унікальний ідентифікатор або 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 Наступний приклад створює таблицю зберігання з типом даних унікального ідентифікатора та використовує 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 ID (1,1) ПЕРШИЙ КЛЮЧ Таблиця без первинного ключа викликає проблеми. Припустимо, у вас мільйон клієнтів, і ви хочете отримати єдиний рядок - ДЕ CustomerID = 'xxx' - ви хочете сканувати всю таблицю або шукати її безпосередньо? Цей подвійний пошук - ID = 524332 та CustomerID = 'xxx' - це дуже сильний пошук. Це і дуже швидко, і дуже безпечно (ніхто не здогадається GUID з грубою силою).
LongChalk
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.