N'guid'
while guid
.NET ( Guid.NewGuid )에 의해 생성 된 GUID -System.Guid 클래스를 포함 해야하는 varchar 열을 SQL에 만들고 싶습니다 .
varchar
GUID에서 기대할 수 있는 길이는 얼마입니까? 정적 길이입니까?
해야 내가 사용 nvarchar
(유니 코드 문자를 사용 이제까지 GUID 것)?
varchar(Guid.Length)
추신. SQL 행 guid 데이터 유형을 사용하고 싶지 않습니다. 나는 단지 무엇인지 묻고있다 Guid.MaxLength
.
답변
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}}
답변
36, GUID는 0-9A-F (16 진수!) 만 사용합니다.
12345678-1234-1234-1234-123456789012
모든 GUID에서 길이는 36 자입니다. GUID의 복잡성에 대한 자세한 내용은 여기를 참조하십시오. .
버팀대를 저장하려면 길이가 2 개 더 필요합니다.
참고 : 36은 대시 사이의 문자열 길이입니다. 실제로는 16 바이트 숫자입니다.
답변
여기에 올바른 작업 uniqueidentifier
은 데이터베이스에 그대로 색인을 생성하는 등의 방법으로 저장하는 것입니다. 다음으로 가장 좋은 옵션은 binary(16)
열입니다. 표준 GUID의 길이는 정확히 16 바이트입니다.
문자열로 저장 해야하는 경우 길이는 실제로 인코딩 방법에 따라 다릅니다. 하이픈이없는 16 진수 (AKA base-16 인코딩)는 32 자 (바이트 당 2 진수) char(32)
입니다.
그러나, 당신은 할 수 원하는 하이픈을 저장합니다. 공간이 부족하지만 데이터베이스가 기본적으로 블롭 / 가이드를 지원하지 않는 경우 Base64 인코딩을 사용 하고 ==
패딩 접미사를 제거 할 수 있습니다 . 그것은 당신에게 22 문자를 제공합니다 char(22)
. 유니 코드를 사용할 필요가 없으며 가변 길이가 필요하지 않으므로 nvarchar(max)
예를 들어 잘못된 선택입니다.
답변
GUID는 16 바이트 길이 (또는 ASCII 16 진수에 해당하는 32 바이트)로 제한되어 있다고 생각합니다.
답변
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)
🙂
답변
다음과 같이하면 22 바이트 :
System.Guid guid = System.Guid.NewGuid();
byte[] guidbytes = guid.ToByteArray();
string uuid = Convert.ToBase64String(guidbytes).Trim('=');
답변
이진 문자열은 원시 바이트 데이터를 저장하고 문자열은 텍스트를 저장합니다. 와 같은 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