質問

SQLにvarchar列を作成したい N'guid' その間 guid .NETによって生成されたGUIDです(GUID.NEWGUID) - class System.guid。

の長さは何ですか varchar GUIDに期待する必要がありますか?静的な長さですか?

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

varchar(Guid.Length)

詩SQL Row 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文字です。一定の長さです。ガイドの複雑さについてもう少し読むことができます ここ.

ブレースを保管したい場合は、さらに2つの長さが必要になります。

注:36は、間にダッシュがある文字列の長さです。実際には16バイトの数字です。

正しい ここでやることは、それを保存することです uniqueidentifier - これは、データベースで完全にインデックスできるなどになります。次のベストオプションはaになります binary(16) 列:標準ガイドの長さは正確に16バイトです。

文字列として保存する必要がある場合、長さは実際にそれをエンコードする方法にかかっています。ハイフンなしでヘックス(別名ベース-16エンコード)として、32文字(バイトごとに2ヘクス桁)になります。 char(32).

しかし、あなたはそうかもしれません 欲しいです ハイフンを保管します。スペースが不足しているが、データベースがネイティブにBlob / Guidをサポートしていない場合は、使用できます base64 エンコードして削除します == パディングサフィックス;それはあなたに22文字を与えるので、 char(22). 。 Unicodeを使用する必要はなく、可変長の必要もありません - したがって nvarchar(max) たとえば、悪い選択になるでしょう。

GUIDは、16バイトの長さ(またはASCII 160個の同等の場合は32バイト)に制約されていると思います。

ガイドは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('=');

バイナリ文字列は生物バイトデータを保存し、文字文字列はテキストを保存します。次のようなヘキシデシマル値を保存するときにバイナリデータを使用します SID, GUID 等々。一意のideidifierデータ型には、グローバルに一意の識別子または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次の例は、一意のIdentifierデータ型を使用してカストテーブルを作成し、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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top