Saya ingin membuat kolom varchar di SQL yang harus berisi N'guid'
sementara guid
adalah GUID yang dihasilkan oleh .NET ( Guid.NewGuid ) - class System.Guid.
Berapa panjang yang varchar
harus 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
.
Guid.NewGuid
tidak memiliki "panjang tali" implisit; Itu semua tergantung pada format yang digunakan dalam ToString (Argumen tidakToString
menggunakan format "D"). Saya lebih suka "B" karena lebih mudah untuk "melihat bahwa itu GUID", tapi itu hanya keakraban dan konvensi.Jawaban:
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 denganToString()
)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}}
sumber
byte[16]
.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.
sumber
Hal yang benar untuk dilakukan di sini adalah untuk menyimpannya
uniqueidentifier
- ini kemudian sepenuhnya dapat diindeks, dll di database. Opsi terbaik berikutnya adalahbinary(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, jadichar(22)
. Tidak perlu menggunakan Unicode, dan tidak perlu untuk panjang variabel - jadinvarchar(max)
akan menjadi pilihan yang buruk, misalnya.sumber
uniqueidentifer
sepenuhnya diindeks tetapibinary(16)
tidak?Saya percaya GUID dibatasi untuk panjang 16 byte (atau 32 byte untuk ASCII hex setara).
sumber
GUID adalah 128 bit, atau
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:
:-)
sumber
22 byte, jika Anda melakukannya seperti ini:
sumber
String biner menyimpan data byte mentah, sementara string karakter menyimpan teks. Gunakan data biner saat menyimpan nilai hexi-desimal seperti
SID
,GUID
dan 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.
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.
sumber