GUIDの文字列の長さはどれくらいですか?
-
13-09-2019 - |
質問
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