Berapa panjang string GUID?

362

Saya ingin membuat kolom varchar di SQL yang harus berisi N'guid'sementara guidadalah GUID yang dihasilkan oleh .NET ( Guid.NewGuid ) - class System.Guid.

Berapa panjang yang varcharharus saya harapkan dari GUID? Apakah panjangnya statis?

Haruskah saya menggunakan nvarchar(apakah GUID akan pernah menggunakan karakter Unicode)?

varchar(Guid.Length)

PS. Saya tidak ingin menggunakan tipe data panduan baris SQL. Saya hanya bertanya apa itu Guid.MaxLength.

Shimmy Weitzhandler
sumber
1
Catatan: Guid.NewGuidtidak memiliki "panjang tali" implisit; Itu semua tergantung pada format yang digunakan dalam ToString (Argumen tidak ToStringmenggunakan format "D"). Saya lebih suka "B" karena lebih mudah untuk "melihat bahwa itu GUID", tapi itu hanya keakraban dan konvensi.
8
mengapa tidak menyimpannya sebagai pengenal unik 16byte?
Filip Cornelissen

Jawaban:

770

Tergantung bagaimana Anda memformat Panduan:

  • Guid.NewGuid().ToString()=> 36 karakter (ditulis dgn tanda penghubung)
    output:12345678-1234-1234-1234-123456789abc

  • Guid.NewGuid().ToString("D")=> 36 karakter (ditulis dgn tanda penghubung, sama dengan ToString())
    output:12345678-1234-1234-1234-123456789abc

  • Guid.NewGuid().ToString("N")=> 32 karakter (khusus Digit)
    output:12345678123412341234123456789abc

  • Guid.NewGuid().ToString("B")=> 38 karakter (kawat gigi)
    output:{12345678-1234-1234-1234-123456789abc}

  • Guid.NewGuid().ToString("P")=> 38 karakter (kurung)
    keluaran:(12345678-1234-1234-1234-123456789abc)

  • Guid.NewGuid().ToString("X")=> 68 karakter (Heksadesimal)
    keluaran:{0x12345678,0x1234,0x1234,{0x12,0x34,0x12,0x34,0x56,0x78,0x9a,0xbc}}

stevehipwell
sumber
1
@ Shimmy - Lihat yang pertama 'Dihipotesiskan, sama seperti default'
stevehipwell
2
Oh, maka itu 'Tanda Hubung' dengan huruf H (Saya sedang mencari di kamus dan tidak dapat menemukan tanda hubung) ... Terima kasih
Shimmy Weitzhandler
24
Saya ingin menambahkan bahwa Guid adalah integer unsigned 128-bit. Anda juga dapat menyimpannya sebagai array 16-byte byte[16].
Eric Falsken
3
ps, ada opsi lain: Guid.NewGuid (). ToString ("X") => keluaran 68 karakter: {0x12345678,0x1234,0x1234, {0x12,0x23,0x12,0x34,0x56,0x78,0x9a, 0xbc}}
Filip Cornelissen
4
komentar tentang 'hanya digit' dengan opsi "N" agak rumit! Anda harus membacanya tanpa kawat gigi & tanda hubung
Jowen
64

36, dan GUID hanya akan menggunakan 0-9A-F (hexidecimal!).

12345678-1234-1234-1234-123456789012

Itu adalah 36 karakter dalam GUID apa pun - panjangnya konstan. Anda dapat membaca lebih banyak tentang seluk-beluk GUID di sini .

Anda akan membutuhkan dua lagi panjangnya jika Anda ingin menyimpan kawat gigi.

Catatan: 36 adalah panjang string dengan tanda hubung di antaranya. Mereka sebenarnya nomor 16-byte.

Eric
sumber
1
Saya pikir salah satu respresentation mengelilingi dengan {}, sehingga itu berarti maks 38
Mitch Wheat
3
Saya cukup yakin Anda melakukannya dengan benar pertama kali, Eric. guid.ToString () mengembalikan string dengan panjang 36, tanpa kawat gigi.
Michael Petrotta
Terima kasih untuk kalian berdua, yang akan saya butuhkan adalah 36, saya bilang saya ingin menyimpan Guid. NewGuid.
Shimmy Weitzhandler
7
Ini salah untuk .NET; Anda hanya mendapatkan 36 karakter! Anda mendapatkan kawat gigi (38 karakter) untuk visualisator C #, tetapi tidak dalam kode!
stevehipwell
Saya menjadi orang yang sangat luar biasa, tetapi 3 digit terakhir bisa saja ABC. Anda benar-benar melewatkan kesempatan di sini.
NH.
32

Hal yang benar untuk dilakukan di sini adalah untuk menyimpannya uniqueidentifier- ini kemudian sepenuhnya dapat diindeks, dll di database. Opsi terbaik berikutnya adalah binary(16)kolom: GUID standar panjangnya persis 16 byte.

Jika Anda harus menyimpannya sebagai string, panjangnya benar-benar tergantung pada bagaimana Anda memilih untuk menyandikannya. Sebagai hex (AKA base-16 encoding) tanpa tanda hubung itu akan menjadi 32 karakter (dua digit hex per byte), jadi char(32).

Namun, Anda mungkin ingin menyimpan tanda hubung. Jika Anda kekurangan ruang, tetapi database Anda tidak mendukung gumpalan / pemandu secara alami, Anda bisa menggunakan Base64 pengkodean dan menghapus ==akhiran padding; itu memberi Anda 22 karakter, jadi char(22). Tidak perlu menggunakan Unicode, dan tidak perlu untuk panjang variabel - jadi nvarchar(max)akan menjadi pilihan yang buruk, misalnya.

Marc Gravell
sumber
mengapa uniqueidentifersepenuhnya diindeks tetapi binary(16)tidak?
BaltoStar
9

Saya percaya GUID dibatasi untuk panjang 16 byte (atau 32 byte untuk ASCII hex setara).

Ross Light
sumber
5

GUID adalah 128 bit, atau

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)

Jadi ya, min 20 karakter, yang sebenarnya menghabiskan lebih dari 4,25 bit, jadi Anda bisa seefisien menggunakan basis yang lebih kecil dari 95 juga; base 85 menjadi yang terkecil yang mungkin masih muat dalam 20 karakter:

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

:-)

cnd
sumber
Secara teori, ya. Tetapi dengan hard disk yang besar saat ini, jauh lebih praktis untuk menggunakan sesuatu seperti varchar (50). Jadi jika Anda menyimpan sesuatu seperti '1234ABC-ABCD-12AB-34CD-FEDCBA12' Anda tidak harus bolak-balik menerjemahkannya. Apa yang Anda sarankan sedikit lebih intensif CPU daripada hanya membaca / menulis nilai, yang merupakan apa yang Anda inginkan dalam praktik.
LongChalk
3

22 byte, jika Anda melakukannya seperti ini:

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

String biner menyimpan data byte mentah, sementara string karakter menyimpan teks. Gunakan data biner saat menyimpan nilai hexi-desimal seperti SID, GUIDdan sebagainya. Tipe data uniqueidentifier berisi pengidentifikasi unik global, atau GUID. Nilai ini diturunkan dengan menggunakan fungsi NEWID () untuk mengembalikan nilai yang unik untuk semua objek. Ini disimpan sebagai nilai biner tetapi ditampilkan sebagai string karakter.

Berikut ini sebuah contoh.

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

Berlaku untuk: SQL Server Contoh berikut membuat tabel cust dengan tipe data pengenal unik, dan menggunakan NEWID untuk mengisi tabel dengan nilai default. Dalam menetapkan nilai default NEWID (), setiap baris baru dan yang sudah ada memiliki nilai unik untuk kolom 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
Pemburu
sumber
Agak lebih disukai untuk menggunakan ID int identitas tambahan (1,1) KUNCI UTAMA Tabel tanpa kunci primer mengundang masalah. Misalkan Anda memiliki sejuta pelanggan dan Anda ingin satu baris - DI MANA PelangganID = 'xxx' - Anda ingin memindai seluruh tabel atau mencarinya langsung? Pencarian ganda ini - ID = 524332 dan CustomerID = 'xxx' adalah pencarian yang sangat kuat. Keduanya sangat cepat, dan sangat aman (tidak ada yang bisa menebak GUID dengan kekerasan).
LongChalk