PDA

View Full Version : سوال: درباره نوع داده ای باینری و تبدیلش



mahdi_14263
پنج شنبه 11 شهریور 1389, 15:08 عصر
سلام
من دوتا سوال برام پیش اومد ، میخواستم دوستان من رو راهنمایی کنند
اول اینکه نوع داده nvarchar(32) حجم بیشتری اشغال میکنه یا varbinary(16)
و دوم اینکه چه جوری میتونم خروجی دستوری مثل زیر رو که از نوع varbinary(16) هست رو به nvarchar تبدیل کنم


select HashBytes('Md5','12')
خروجیش اینه که از نوع باینریه
0xC20AD4D76FE97759AA27A0C99BFF6710
میخوام به صورت کاراکتری به صورت زیر بشه
C20AD4D76FE97759AA27A0C99BFF6710

از این که وقت گذاشتین ممنونم

بهزادصادقی
شنبه 13 شهریور 1389, 13:35 عصر
سلام
نوع داده nvarchar(32) حجم بیشتری اشغال میکنه یا varbinary(16)


گاهی مواقع یکی و گاهی مواقع دیگری!

ببین، هم nvarchar و هم varbinary دارند از کلمه "var" توی اسمشان استفاده می کنند. این یعنی که طول رشته داده هایی که هر دو این type ها ساپورت می کنند variable است، یعنی متغیر.

اگر شما متغیری داشته باشی که نوعش را nvarchar 32 اعلام کرده ای، تا زمانی که هنوز آن متغییر را شما بهش مقداری نداده ای، طول داده هایش 0 خواهد بود، چرا که ارزش آن null خواهد بود. بعد از اینکه شما بهش یک مقدار دادی، اون وقت ارزش آن و طول داده های آن هم فرق خواهند کرد.

حداکثر حجمی که یک متغییر از نوع varbinary 16 می تواند داشته باشد برابر است با 16 بایت. حداکثر حجمی که یک متغییر از نوع nvarchar 32 می تواند داشته باشد، برابر است به 64 بایت. ولی اینکه حچم دقیق این دو متغیر چه می باشد بستگی دارد به اینکه دقیقا به هر کدامشان چه مقداری داده شده.

برای اینکه دقیقا ببینی حچم یک متغیر چند بایت است، می توانی از تابع datalength استفاده کنی. نوع اسفاده اش را در زیر می توانی ببینی:



declare @myVBin varbinary(16);
declare @myNVar nvarchar(32);

select
datalength( @myVBin ) myVBin_Length,
datalength( @myNVar ) myNVar_Length

-- Both will be null, because none is initialized

set @myVBin = 0x0000000000000000; -- 16 Hex chars = 8 bytes

select
datalength( @myVBin ) myVBin_Length, -- 8 bytes
datalength( @myNVar ) myNVar_Length -- Still null

set @myVBin = 0x00000000000000001111111111111111; -- 32 Hex chars = 16 bytes
set @myNVar = '12345678'; -- 8 Unicode chars = 16 bytes

select
datalength( @myVBin ) myVBin_Length, -- 16 bytes
datalength( @myNVar ) myNVar_Length -- 16 bytes


set @myVBin = 0x000000000000000011111111111111112222222222222222 ; -- Still only 32 Hex chars = 16 bytes
set @myNVar = '12345678901234567890123456789012'; -- 32 Unicode chars = 64 bytes

select
datalength( @myVBin ) myVBin_Length, -- 16 bytes
datalength( @myNVar ) myNVar_Length -- 64 bytes


مفهوم واقع می شود؟



چه جوری میتونم خروجی دستوری مثل زیر رو که از نوع varbinary(16) هست رو به nvarchar تبدیل کنم


من خودم تا حالا این کار را نکرده ام، ولی مثل اینکه SQL Server یک تابع undocumented برای این کار دارد به اسم fn_varbintohexstr. ببین این لینک می تواند کمکی به تو بکند یا نه:

Converting to HEX with fn_varbintohexstr (http://www.novicksoftware.com/udfofweek/Vol1/T-SQL-UDF-Volume-1-Number-26-fn_varbintohexstr.htm)