GUIDの文字列の長さとは何ですか?


361

.NET(Guid.NewGuid)-クラスSystem.Guid によって生成されたGUIDであるN'guid'間、SQLにvarchar列を作成する必要がありguidます。

varcharGUIDに期待すべき長さはどれくらいですか?静的な長さですか?

使用する必要nvarcharがありますか(GUIDはUnicode文字を使用しますか)?

varchar(Guid.Length)

PS。SQL行GUIDデータ型を使用したくありません。私はただ何であるかを尋ねていますGuid.MaxLength


1
注:Guid.NewGuid暗黙の「文字列長」はありません。それはすべて、ToStringで使用されているフォーマットに依存します(引数なしToStringは「D」フォーマットを使用します)。「GUIDであることがわかる」ほうが簡単なので「B」を選択しますが、これは慣れ親しみと慣習にすぎません。

8
16バイトの一意の識別子として保存しないのはなぜですか?
Filip Cornelissen 2013年

回答:


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
@シミー-最初の「ハイパネート、デフォルトと同じ」を見てください
stevehipwell

2
ああ、それはHの付いた「ハイフン」です(私は辞書を探していて、ハイフンを見つけることができませんでした)...ありがとう
Shimmy Weitzhandler

24
補足すると、Guidは128ビットの符号なし整数です。16バイトの配列として保存することもできますbyte[16]
Eric Falsken

3
PS、別のオプションがあります:Guid.NewGuid()。ToString( "X")=> 68文字出力:{0x12345678,0x1234,0x1234、{0x12,0x23,0x12,0x34,0x56,0x78,0x9a、0xbc}}
Filip Cornelissen 2013年

4
「N」オプションを使用した「数字のみ」に関するコメントは少し注意が必要です。ブレースとハイフンなしで読む必要があります
Jowen

63

36、およびGUIDは0-9A-F(16進数!)のみを使用します。

12345678-1234-1234-1234-123456789012

これは、GUIDの36文字です。これらは一定の長さです。GUIDの複雑さについては、こちらでもう少し詳しく読むことができます

ブレースを保存する場合は、さらに2つ必要です。

注:36は、ダッシュを挟んだストリングの長さです。実際には16バイトの数値です。


1
1つの表現は{}で囲まれていると思うので、最大38を意味します
ミッチウィート

3
エリック、あなたが初めてそれを正しかったと確信しています。guid.ToString()は、中括弧なしの長さ36のストリングを返します。
Michael Petrotta

2つありがとう、私が必要とするのは36です。
Shimmy Weitzhandler 2009年

7
これは.NETでは間違っています。36文字しか獲得できません。C#ビジュアライザーの括弧(38文字)は取得できますが、コードでは取得できません。
stevehipwell

私は教育的ですが、最後の3桁はABCであった可能性があります。あなたは本当にここで機会を逃しました。
NH。

32

正しいここで行う事はとしてそれを格納することですuniqueidentifierこれは、データベースでなど、完全にインデックス可能です- 。次善のオプションはbinary(16)列です。標準GUIDの長さはちょうど16バイトです。

文字列として保存する必要がある場合、実際の長さは、エンコードする方法によって異なります。ハイフンなしの六角(AKAベース16符号化)としてそのように、32文字(バイトごとに2つの進数字)であろうchar(32)

しかし、あなたは可能性がしたいハイフンを格納します。スペースが不足しているが、データベースがblob / guidsをネイティブでサポートしていない場合は、Base64エンコーディングを使用して、==パディングサフィックスを削除できます。それはそう、あなたに22文字を提供しますchar(22)。Unicodeを使用する必要はなく、可変長も必要ありませんnvarchar(max)。たとえば、不適切な選択になります。


なぜuniqueidentifer完全に索引付け可能ですが、そうでbinary(16)はありませんか?
BaltoStar 2018

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 2018年

3

次のようにすると、22バイトになります。

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

0

バイナリ文字列は生のバイトデータを格納し、文字列はテキストを格納します。など河西-小数点値記憶するとき、バイナリデータを使用するSIDGUIDなどを。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次の例では、uniqueidentifierデータ型のカストテーブルを作成し、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を使用するほうがいくらか好ましい主キーのないテーブルは問題を引き起こしています。100万人の顧客がいて、1行が必要だとします-WHERE CustomerID = 'xxx'-テーブル全体をスキャンするか、直接検索しますか?この二重検索-ID = 524332およびCustomerID = 'xxx'は非常に強力な検索です。これは非常に高速であり、非常に安全です(ブルートフォースでGUIDを推測することはできません)。
LongChalk 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.