Độ dài chuỗi của GUID là bao nhiêu?


361

Tôi muốn tạo một cột varchar trong SQL nên chứa N'guid'trong khi đó guidlà GUID được tạo bởi .NET ( Guid.NewGuid ) - class System.Guid.

Độ dài của varchartôi nên mong đợi từ GUID là bao nhiêu? Có phải là một chiều dài tĩnh?

Tôi có nên sử dụng nvarchar(GUID có bao giờ sử dụng các ký tự Unicode) không?

varchar(Guid.Length)

Tái bút Tôi không muốn sử dụng kiểu dữ liệu hướng dẫn hàng SQL. Tôi chỉ hỏi những gì là Guid.MaxLength.


1
Lưu ý: Guid.NewGuidkhông có "độ dài chuỗi" ẩn; Tất cả phụ thuộc vào định dạng được sử dụng trong ToString (Không có đối số ToStringsử dụng định dạng "D"). Tôi thích "B" hơn vì "dễ hiểu" đó là HƯỚNG DẪN ", nhưng đó chỉ là sự quen thuộc và quy ước.

8
Tại sao không chỉ lưu nó dưới dạng một định danh 16byte?
Filip Cornelissen

Câu trả lời:


769

Nó phụ thuộc vào cách bạn định dạng Hướng dẫn:

  • Guid.NewGuid().ToString()=> 36 ký tự (Hyphenated)
    đầu ra:12345678-1234-1234-1234-123456789abc

  • Guid.NewGuid().ToString("D") => 36 ký tự (được gạch nối, giống như ToString())
    đầu ra:12345678-1234-1234-1234-123456789abc

  • Guid.NewGuid().ToString("N") => 32 ký tự (chỉ chữ số)
    đầu ra:12345678123412341234123456789abc

  • Guid.NewGuid().ToString("B") => 38 ký tự (Dấu ngoặc)
    đầu ra:{12345678-1234-1234-1234-123456789abc}

  • Guid.NewGuid().ToString("P") => 38 ký tự (Dấu ngoặc đơn)
    đầu ra:(12345678-1234-1234-1234-123456789abc)

  • Guid.NewGuid().ToString("X")=> 68 ký tự (thập lục phân)
    đầu ra:{0x12345678,0x1234,0x1234,{0x12,0x34,0x12,0x34,0x56,0x78,0x9a,0xbc}}


1
@Shimmy - Nhìn vào cái đầu tiên 'Hypenated, giống như mặc định'
stevehipwell

2
Ồ, vậy thì đó là 'Dấu gạch ngang' với chữ H (Tôi đang tìm trong từ điển và không thể tìm thấy hypen) ... Cảm ơn
Shimmy Weitzhandler

24
Tôi muốn thêm rằng Guid là số nguyên không dấu 128 bit. Bạn cũng có thể lưu trữ nó dưới dạng một mảng 16 byte byte[16].
Eric Falsken

3
ps, có một tùy chọn khác: Guid.NewGuid (). ToString ("X") => 68 ký tự đầu ra: {0x12345678,0x1234,0x1234, {0x12,0x23,0x12,0x34,0x56,0x78,0x9a, 0xb}
Filip Cornelissen

4
nhận xét về 'chỉ các chữ số' với tùy chọn "N" là một chút khó khăn! Bạn nên đọc nó như không có dấu ngoặc nhọn và dấu gạch nối
Jowen

63

36 và GUID sẽ chỉ sử dụng 0-9A-F (thập lục phân!).

12345678-1234-1234-1234-123456789012

Đó là 36 ký tự trong bất kỳ GUID nào - chúng có độ dài không đổi. Bạn có thể đọc thêm một chút về sự phức tạp của GUID tại đây .

Bạn sẽ cần thêm hai chiều dài nếu bạn muốn lưu trữ niềng răng.

Lưu ý: 36 là độ dài chuỗi có dấu gạch ngang ở giữa. Chúng thực sự là các số 16 byte.


1
Tôi nghĩ rằng một giải thích bao quanh {}, vì vậy điều đó có nghĩa là tối đa 38
Mitch Wheat

3
Tôi khá chắc chắn rằng bạn đã có nó ngay lần đầu tiên, Eric. guide.ToString () trả về một chuỗi có độ dài 36, không có dấu ngoặc nhọn.
Michael Petrotta

Cảm ơn hai bạn, thứ tôi cần là 36, tôi nói tôi muốn lưu trữ Guid.NewGuid.
Shimmy Weitzhandler

7
Điều này là sai đối với .NET; bạn chỉ nhận được 36 ký tự! Bạn nhận được dấu ngoặc nhọn (38 ký tự) cho trình hiển thị C #, nhưng không có mã!
stevehipwell

Tôi là người phạm tội, nhưng 3 chữ số cuối có thể là ABC. Bạn thực sự đã bỏ lỡ một cơ hội ở đây.
NH.

32

Điều chính xác cần làm ở đây là lưu trữ nó dưới dạng uniqueidentifier- sau đó hoàn toàn có thể lập chỉ mục, v.v. tại cơ sở dữ liệu. Tùy chọn tốt nhất tiếp theo sẽ là một binary(16)cột: GUID tiêu chuẩn có độ dài chính xác 16 byte.

Nếu bạn phải lưu trữ nó dưới dạng một chuỗi, độ dài thực sự phụ thuộc vào cách bạn chọn để mã hóa nó. Vì hex (mã hóa AKA cơ sở-16) không có dấu gạch ngang, nó sẽ có 32 ký tự (hai chữ số hex mỗi byte), vì vậy char(32).

Tuy nhiên, bạn có thể muốn lưu trữ các dấu gạch nối. Nếu bạn thiếu không gian, nhưng cơ sở dữ liệu của bạn không hỗ trợ blobs / guids nguyên bản, bạn có thể sử dụng hóa Base64 và loại bỏ ==hậu tố đệm; cung cấp cho bạn 22 ký tự, vì vậy char(22). Không cần sử dụng Unicode và không cần độ dài thay đổi - vì vậy, đây nvarchar(max)sẽ là một lựa chọn tồi.


Tại sao có uniqueidentiferthể lập chỉ mục đầy đủ nhưng binary(16)không?
BaltoStar

9

Tôi tin rằng GUID bị ràng buộc với độ dài 16 byte (hoặc 32 byte cho tương đương hex ASCII).


5

GUID là 128 bit, hoặc

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)

Vì vậy, có, tối thiểu 20 ký tự, thực sự lãng phí hơn 4,25 bit, do đó bạn cũng có thể hiệu quả bằng cách sử dụng các cơ sở nhỏ hơn 95; cơ sở 85 là cơ sở nhỏ nhất có thể vẫn phù hợp với 20 ký tự:

0 through -r54lj%NUUO[Hi$c2ym0 (base 85, using 0-9A-Za-z!"#$%&'()*+,- chars)

:-)


Về lý thuyết, có. Nhưng với các đĩa cứng khổng lồ ngày nay, việc sử dụng một cái gì đó như varchar (50) sẽ thực tế hơn nhiều. Vì vậy, nếu bạn lưu trữ một cái gì đó như '1234ABC-ABCD-12AB-34CD-FedCBA12', bạn không cần phải qua lại trong việc dịch nó. Những gì bạn đang đề xuất là CPU chuyên sâu hơn một chút so với chỉ đọc / ghi giá trị, đó là những gì bạn muốn trong thực tế.
LongChalk

3

22 byte, nếu bạn làm như thế này:

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

0

Chuỗi nhị phân lưu trữ dữ liệu byte thô, trong khi chuỗi ký tự lưu trữ văn bản. Sử dụng dữ liệu nhị phân khi lưu trữ các giá trị thập phân hexi SID, GUIDv.v. Kiểu dữ liệu định danh duy nhất chứa định danh duy nhất toàn cầu hoặc GUID. Giá trị này được lấy bằng cách sử dụng hàm NEWID () để trả về một giá trị duy nhất cho tất cả các đối tượng. Nó được lưu trữ dưới dạng giá trị nhị phân nhưng nó được hiển thị dưới dạng chuỗi ký tự.

Đây là một ví dụ.

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

Áp dụng cho: SQL Server Ví dụ sau đây tạo bảng lưu trữ với kiểu dữ liệu định danh duy nhất và sử dụng NEWID để điền vào bảng với giá trị mặc định. Khi gán giá trị mặc định của NEWID (), mỗi hàng mới và hàng hiện có một giá trị duy nhất cho cột 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

Một cách nào đó thích hợp hơn để sử dụng một danh tính int ID bổ sung (1,1) KEY PRIMary KEY Một bảng không có khóa chính sẽ gây rắc rối. Giả sử bạn có một triệu khách hàng và bạn muốn có một dòng duy nhất - WHERE CustomerID = 'xxx' - bạn muốn quét toàn bộ bảng hoặc tìm kiếm trực tiếp? Tìm kiếm kép này - ID = 524332 và CustomerID = 'xxx' là một tìm kiếm rất mạnh. Cả hai đều rất nhanh và rất an toàn (không ai có thể đoán GUID bằng vũ lực).
LongChalk
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.