GUID의 문자열 길이는 얼마입니까?


361

N'guid'while guid.NET ( Guid.NewGuid )에 의해 생성 된 GUID -System.Guid 클래스를 포함 해야하는 varchar 열을 SQL에 만들고 싶습니다 .

varcharGUID에서 기대할 수 있는 길이는 얼마입니까? 정적 길이입니까?

해야 내가 사용 nvarchar(유니 코드 문자를 사용 이제까지 GUID 것)?

varchar(Guid.Length)

추신. SQL 행 guid 데이터 유형을 사용하고 싶지 않습니다. 나는 단지 무엇인지 묻고있다 Guid.MaxLength.


1
참고 : Guid.NewGuid암시적인 "문자열 길이"는 없습니다. 그것은 모두 ToString에 사용 된 형식에 달려 있습니다 (인수 ToString는 "D"형식을 사용합니다). "BUI"를 더 쉽게 볼 수 있기 때문에 "B"를 선호하지만 이는 익숙 함과 관습 일뿐입니다.

8
왜 16byte uniqueidentifier로 저장하지 않습니까?
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 자 (16 진)
    출력 :{0x12345678,0x1234,0x1234,{0x12,0x34,0x12,0x34,0x56,0x78,0x9a,0xbc}}


1
@ Shimmy-첫 번째 '히피 네이트, 기본과 동일'을보십시오
stevehipwell

2
오, 그리고 H가있는 '하이픈'입니다 (사전을보고 있었고 하이펜을 찾을 수 없었습니다) ... 감사합니다
Shimmy Weitzhandler

24
Guid는 부호없는 128 비트 정수라고 덧붙이고 싶습니다. 16 바이트 배열로 저장할 수도 있습니다 byte[16].
Eric Falsken

3
추신 : 다른 옵션이 있습니다 : Guid.NewGuid (). ToString ( "X") => 68 문자 출력 : {0x12345678,0x1234,0x1234, {0x12,0x23,0x12,0x34,0x56,0x78,0x9a, 0xbc}}
Filip Cornelissen

4
"N"옵션을 사용한 '숫자 만'에 대한 의견은 약간 까다 롭습니다! 중괄호와 하이픈없이 읽어야합니다
Jowen

63

36, GUID는 0-9A-F (16 진수!) 만 사용합니다.

12345678-1234-1234-1234-123456789012

모든 GUID에서 길이는 36 자입니다. GUID의 복잡성에 대한 자세한 내용은 여기를 참조하십시오. .

버팀대를 저장하려면 길이가 2 개 더 필요합니다.

참고 : 36은 대시 사이의 문자열 길이입니다. 실제로는 16 바이트 숫자입니다.


1
하나의 표현이 {}로 둘러싸여 있다고 생각합니다. 최대 38을 의미합니다.
Mitch Wheat

3
에릭, 네가 처음부터 잘했다고 확신한다. guid.ToString ()은 중괄호없이 길이가 36 인 문자열을 반환합니다.
Michael Petrotta 2016 년

둘 다 고마워, 내가 필요로하는 것은 36 살인데, 나는 Guid.NewGuid를 저장하고 싶다고 말했다.
Shimmy Weitzhandler

7
이것은 .NET에 잘못되었습니다. 당신은 36 문자를 얻을 수 있습니다! C # Visualizer에는 중괄호 (38 자)가 있지만 코드에는 없습니다.
stevehipwell

나는 pedantic하고 있지만 마지막 3 자리는 ABC 일 수 있습니다. 당신은 여기서 기회를 정말로 놓쳤다.
NH.

32

여기에 올바른 작업 uniqueidentifier은 데이터베이스에 그대로 색인을 생성하는 등의 방법으로 저장하는 것입니다. 다음으로 가장 좋은 옵션은 binary(16)열입니다. 표준 GUID의 길이는 정확히 16 바이트입니다.

문자열로 저장 해야하는 경우 길이는 실제로 인코딩 방법에 따라 다릅니다. 하이픈이없는 16 진수 (AKA base-16 인코딩)는 32 자 (바이트 당 2 진수) char(32)입니다.

그러나, 당신은 할 수 원하는 하이픈을 저장합니다. 공간이 부족하지만 데이터베이스가 기본적으로 블롭 / 가이드를 지원하지 않는 경우 Base64 인코딩을 사용 하고 ==패딩 접미사를 제거 할 수 있습니다 . 그것은 당신에게 22 문자를 제공합니다 char(22). 유니 코드를 사용할 필요가 없으며 가변 길이가 필요하지 않으므로 nvarchar(max)예를 들어 잘못된 선택입니다.


uniqueidentifer완전 색인을 생성 할 수 binary(16)는 없습니까?
BaltoStar

9

GUID는 16 바이트 길이 (또는 ASCII 16 진수에 해당하는 32 바이트)로 제한되어 있다고 생각합니다.


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

이진 문자열은 원시 바이트 데이터를 저장하고 문자열은 텍스트를 저장합니다. 와 같은 16 진 값을 저장할 때 이진 데이터를 사용하십시오 SID.GUID 등등을. uniqueidentifier 데이터 형식에는 GUID (Globally Unique Identifier)가 포함됩니다. 이 값은 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 다음 예제는 uniqueidentifier 데이터 형식으로 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

추가 ID를 사용하는 것이 더 바람직합니다. int identity (1,1) PRIMARY KEY 기본 키가없는 테이블에 문제가 있습니다. 백만 명의 고객이 있고 단일 행 (WHERE CustomerID = 'xxx')을 원한다고 가정하면 전체 테이블을 스캔하거나 직접 검색 하시겠습니까? 이 이중 검색 (ID = 524332 및 CustomerID = 'xxx')은 매우 강력한 검색입니다. 매우 빠르고 안전합니다 (아무도 GUID를 무차별하게 추측 할 수는 없습니다).
LongChalk 12
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.