ความยาวสตริงของ GUID คืออะไร


361

ฉันต้องการสร้างคอลัมน์ varchar ใน SQL ที่ควรมีN'guid'while guidเป็น GUID ที่สร้างโดย. NET ( Guid.NewGuid ) - คลาส System.Guid

ความยาวของvarcharฉันควรคาดหวังอะไรจาก GUID? มันเป็นความยาวคงที่?

ฉันควรใช้nvarchar(GUID จะเคยใช้อักขระ Unicode หรือไม่)

varchar(Guid.Length)

PS ฉันไม่ต้องการใช้ guid data-row แถว SQL Guid.MaxLengthฉันเพียงแค่ขอให้สิ่งที่เป็น


1
หมายเหตุ: Guid.NewGuidไม่มี "ความยาวสตริง" โดยนัย; ทุกอย่างขึ้นอยู่กับรูปแบบที่ใช้ในToString (ไม่มีการโต้แย้งToStringใช้การจัดรูปแบบ "D") ฉันชอบ "B" มากกว่าเพราะง่ายกว่าที่จะ "เห็นว่าเป็น GUID" แต่นั่นเป็นเพียงความคุ้นเคยและการประชุม

8
ทำไมไม่เพียง แต่บันทึกเป็นตัวระบุเอกลักษณ์ 16byte
Filip Cornelissen

คำตอบ:


769

ขึ้นอยู่กับว่าคุณจัดรูปแบบ 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}}


1
@Shimmy - ดูรายการแรก 'Hypenated เหมือนกับค่าเริ่มต้น'
stevehipwell

2
โอ้แล้วมันเป็น 'เครื่องหมายขีดคั่น' พร้อม H (ฉันกำลังมองหาในพจนานุกรมและไม่สามารถค้นหา hypen) ... ขอบคุณ
Shimmy Weitzhandler

24
ฉันต้องการเพิ่มว่า Guid เป็นจำนวนเต็ม 128 บิตที่ไม่ได้ลงชื่อ นอกจากนี้คุณยังสามารถเก็บไว้เป็น byte[16]array
Eric Falsken

3
ป.ล. มีตัวเลือกอื่น: Guid.NewGuid () ToString ("X") => 68 ตัวอักษรผลลัพธ์: {0x12345678,0x1234,0x1234, {0x12,0x23,0x12,0x34,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9,0x9, ที่หนึ่ง
Filip Cornelissen

4
ความคิดเห็นเกี่ยวกับ 'ตัวเลขเท่านั้น' ด้วยตัวเลือก "N" นั้นค่อนข้างยุ่งยาก! คุณควรอ่านโดยไม่ต้องใช้เครื่องมือจัดฟันและยัติภังค์
Jowen

63

36 และ GUID จะใช้ 0-9A-F (เลขฐานสิบหก!) เท่านั้น

12345678-1234-1234-1234-123456789012

นั่นคือ 36 ตัวอักษรใน GUID ใด ๆ - มีความยาวคงที่ คุณสามารถอ่านเพิ่มเติมเกี่ยวกับความซับซ้อนของ GUID ได้ที่นี่ที่นี่

คุณจะต้องมีความยาวเพิ่มขึ้นอีกสองเท่าหากคุณต้องการจัดฟัน

หมายเหตุ: 36 คือความยาวสตริงโดยมีเครื่องหมายขีดกลางอยู่ระหว่าง จริงๆแล้วพวกเขาเป็นตัวเลข 16 ไบต์


1
ฉันคิดว่าการนำเสนออย่างใดอย่างหนึ่งล้อมรอบด้วย {} ดังนั้นจะหมายถึงสูงสุดของ 38
มิทช์ข้าวสาลี

3
ฉันค่อนข้างแน่ใจว่าคุณทำให้ถูกต้องในครั้งแรกเอริค guid.ToString () ส่งคืนสตริงที่มีความยาว 36 โดยไม่มีวงเล็บปีกกา
Michael Petrotta

ขอบคุณสำหรับคุณสองคนสิ่งที่ฉันต้องการคือ 36 ฉันบอกว่าฉันต้องการเก็บ Guid.NewGuid
Shimmy Weitzhandler

7
สิ่งนี้ผิดสำหรับ. NET คุณจะได้รับเพียง 36 ตัวอักษร! คุณจะได้รับเครื่องมือจัดฟัน (38 ตัวอักษร) สำหรับ C # visualizer แต่ไม่มีรหัส!
stevehipwell

ฉันเป็นคนคล่องแคล่ว แต่ตัวเลข 3 หลักสุดท้ายอาจเป็น ABC คุณพลาดโอกาสจริง ๆ ที่นี่
นิวแฮมป์เชียร์

32

ที่ถูกต้องที่จะทำที่นี่คือการเก็บเป็นuniqueidentifier- นี้เป็นแล้วสามารถจัดทำดัชนีอย่างเต็มที่ ฯลฯ ในฐานข้อมูล ตัวเลือกที่ดีที่สุดถัดไปจะเป็นbinary(16)คอลัมน์: GUID มาตรฐานมีความยาว 16 ไบต์

หากคุณต้องเก็บมันไว้เป็นสตริงความยาวจะมาลงในแบบที่คุณเลือกที่จะเข้ารหัส ในฐานะเลขฐานสิบหก (การเข้ารหัสฐาน AKA-16) โดยไม่มีเครื่องหมายขีดคั่นจึงต้องเป็นอักขระ 32 ตัว (ตัวเลขฐานสิบหกสองตัวต่อไบต์)char(32)ดังนั้น

อย่างไรก็ตามคุณอาจต้องการเก็บยัติภังค์ หากคุณมีพื้นที่ไม่เพียงพอ แต่ฐานข้อมูลของคุณไม่รองรับ blobs / guids โดยพื้นฐานคุณสามารถใช้การเข้ารหัสBase64และลบ==ส่วนต่อท้ายของช่องว่างภายใน ที่ช่วยให้คุณ 22 char(22)ตัวอักษรดังนั้น ไม่จำเป็นต้องใช้ Unicode และไม่จำเป็นต้องใช้ความยาวของตัวแปร - ดังนั้นnvarchar(max)จะเป็นตัวเลือกที่ไม่ดีเช่น


ทำไมuniqueidentiferสามารถจัดทำดัชนีได้อย่างสมบูรณ์ แต่binary(16)ไม่ใช่
BaltoStar

9

ฉันเชื่อว่า GUID นั้นถูกจำกัดความยาวของ 16- ไบต์ (หรือ 32 ไบต์สำหรับ ASCII hex ที่เทียบเท่ากัน)


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' คุณไม่จำเป็นต้องแปลซ้ำ ๆ สิ่งที่คุณแนะนำคือ CPU มีความเข้มข้นมากกว่าเล็กน้อยเพียงแค่อ่าน / เขียนค่าซึ่งเป็นสิ่งที่คุณต้องการในทางปฏิบัติ
LongChalk

3

22 ไบต์ถ้าคุณทำเช่นนี้:

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

0

สตริงไบนารีเก็บข้อมูลดิบไบต์ในขณะที่สตริงอักขระเก็บข้อความ ใช้ข้อมูลไบนารีเมื่อการจัดเก็บค่า Hexi-ทศนิยมเช่น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

ค่อนข้างจะดีกว่าที่จะใช้รหัสประจำตัว int เพิ่มเติม (1,1) คีย์หลักตารางที่ไม่มีคีย์หลักกำลังเชิญปัญหา สมมติว่าคุณมีลูกค้านับล้านและคุณต้องการบรรทัดเดียว - WHERE CustomerID = 'xxx' - คุณต้องการสแกนทั้งตารางหรือค้นหาโดยตรง การค้นหาคู่นี้ - ID = 524332 และ CustomerID = 'xxx' เป็นการค้นหาที่แข็งแกร่งมาก มันทั้งเร็วและปลอดภัยมาก (ไม่มีใครสามารถเดา GUID ได้ด้วยกำลังดุร้าย)
LongChalk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.