What
are the differences between BINAY and VARBINAY [BINARY VS VARBINARY]?
Which
data type should use for defining a column in a table [BINAY VS VARBINARY]?
| 
BINARY | 
VARBINARY | ||||||||||||||||||||||||||||||||||
| 
Bytes | 
It consumes 1 byte per character. | 
It consumes 1 byte per character. 
It is introduced in
  SQL Server 2005. | |||||||||||||||||||||||||||||||||
| 
Data Length | 
Maximum storage size
  is 8000 bytes. 
Fixed-length binary
  data with a length of n bytes, where n is a value from 1
  through 8,000. The storage size is n bytes. | 
MAX indicates that the
  maximum storage size is 2^31-1 bytes (2 GB). The storage size is the actual
  length of the data entered + 2 bytes. 
Variable-length binary
  data. N can be a value from 1 through 8,000. max indicates that the maximum
  storage size is 2^31-1 bytes. The storage size is the actual length of the
  data entered + 2 bytes. The data that is entered can be 0 bytes in length.
  The ANSI SQL synonym for varbinary is binary varying. | |||||||||||||||||||||||||||||||||
| 
Data  
Storage 
Type | 
BINARY is used to
  store the image files (BMP, TIFF, GIF, or JPEG format files)  and 
  binary data. 
BINARY(N)  
When N is not specified in a data
  definition or variable declaration statement, the default length is 1.  
When N is not specified with the CAST
  function, the default length is 30. | 
VARBINARY(N)  
When N is not specified in a data
  definition or variable declaration statement, the default length is 1.  
When N is not specified with the CAST
  function, the default length is 30. 
VARBINARY(MAX) data
  type is used to store images/pdf/word etc files and any data. | |||||||||||||||||||||||||||||||||
| 
Declaring | 
 
Test  Conversion Script: 
DECLARE @VarChar VARCHAR(100) = '';  
DECLARE @Cnt INT = 1 
WHILE @Cnt < 100 
BEGIN 
          SET
  @VarChar = @VarChar +
  'A' 
          SET
  @Cnt = @Cnt +
  1 
END 
SET @VarChar = @VarChar + 'B' 
SELECT @VarChar 
Result: 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAB 
SELECT CONVERT(VARCHAR(100),CONVERT(BINARY(258), @VarChar));   
Result: 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAB | 
 
Test  Conversion Script: 
DECLARE @VarChar VARCHAR(100) = '';  
DECLARE @Cnt INT = 1 
WHILE @Cnt < 100 
BEGIN 
          SET
  @VarChar = @VarChar +
  'A' 
          SET
  @Cnt = @Cnt +
  1 
END 
SET @VarChar = @VarChar + 'B' 
SELECT @VarChar 
Result: 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAB 
SELECT CONVERT(VARCHAR(100),CONVERT(VARBINARY(258), @VarChar));   
Result: 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
AAAAAAAAAAAAB | |||||||||||||||||||||||||||||||||
| 
Conversion /CAST | 
DECLARE @Binary BINARY(128);   
SET @Binary = 123456;   
SET @Binary = @Binary + 1;   
SELECT CAST(@Binary AS INT);   
RESULT:  123457 
SELECT CONVERT(INT, @Binary);   
RESULT: 
  123457 
DECLARE @VarChar VARCHAR(128)   
SET @VarChar = 'Govindaraj Kanniappan';   
SELECT CAST(@VarChar AS  BINARY(128));   
RESULT:   
0x476F76696E646172616A204B616E 
6E69617070616E0000000000000000 
0000000000000000000000000000000 
0000000000000000000000000000000 
0000000000000000000000000000000 
0000000000000000000000000000000 
0000000000000000000000000000000 
0000000000000000000000000000000 
000000000000 
SELECT CONVERT(BINARY(128), @VarChar); 
RESULT:   
0x476F76696E646172616A204B616E 
6E69617070616E0000000000000000 
0000000000000000000000000000000 
0000000000000000000000000000000 
0000000000000000000000000000000 
0000000000000000000000000000000 
0000000000000000000000000000000 
0000000000000000000000000000000 
000000000000 | 
DECLARE @VarBinary VARBINARY(128);   
SET @VarBinary = 123456;   
SET @VarBinary = @VarBinary + 1;   
SELECT CAST(@VarBinary AS INT);   
RESULT:  123457 
SELECT CONVERT(INT, @VarBinary);   
RESULT: 
  123457 
DECLARE @VarChar VARCHAR(128)   
SET @VarChar = 'Govindaraj Kanniappan';   
SELECT CAST(@VarChar AS  VARBINARY(128));   
RESULT:   
0x476F76696E646172616A204B616E 
6E69617070616E0000000000000000 
0000000000000000000000000000000 
0000000000000000000000000000000 
0000000000000000000000000000000 
0000000000000000000000000000000 
0000000000000000000000000000000 
0000000000000000000000000000000 
000000000000 
SELECT CONVERT(VARBINARY(128), @VarChar); 
RESULT:  
0x476F76696E646172616A204B616E 
6E69617070616E0000000000000000 
0000000000000000000000000000000 
0000000000000000000000000000000 
0000000000000000000000000000000 
0000000000000000000000000000000 
0000000000000000000000000000000 
0000000000000000000000000000000 
000000000000 | |||||||||||||||||||||||||||||||||
| 
Index | 
The maximum
  permissible key length is 900 bytes for creating the Index. 
Index can’t be created
  on BINARY data type if the data length above 900 bytes. It throws the
  exception error when we create an index on this data type. 
CREATE NONCLUSTERED INDEX IX_CompanyImage_ImageBinary 
ON dbo.CompanyImage(ImageBinary) 
WITH (PAD_INDEX = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS 
  = ON, 
STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) 
Error: 
Index 'IX_CompanyImage_ImageBinary' was not created. This
  index has a key length of at least 2000 bytes. The maximum permissible key
  length is 900 bytes. | 
Index can’t be created
  on VARBINARY (MAX)  data type even
  though it is needed. It throws the exception error when we create an index on
  this data type. 
CREATE NONCLUSTERED INDEX IX_CompanyImage_ImageVarBinary 
ON dbo.CompanyImage(ImageVarBinary) 
WITH (PAD_INDEX = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS 
  = ON, 
STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) 
Error: 
Column 'ImageVarBinary' in table 'dbo.CompanyImage' is of a
  type that is invalid for use as a key column in an index. | |||||||||||||||||||||||||||||||||
| 
Use When? | 
Use BINARY when the
  sizes of the column data entries are consistent. | 
Use VARBINARY when the
  sizes of the column data entries vary considerably. | |||||||||||||||||||||||||||||||||
| 
Example | 
CREATE TABLE CompanyImage 
  ( 
     ImageID int
  IDENTITY(1,1) NOT NULL, 
     ImageVarBinary VARBINARY(max), 
     ImageBinary    BINARY(8000) 
  ); 
GO 
-- Insert ER_Attribute.png file data to varbiinary  
INSERT INTO CompanyImage(ImageVarBinary) 
SELECT * 
FROM   OPENROWSET(BULK 'E:\TutorialTips\sql\Images\ER_Attribute.png', SINGLE_BLOB) IMG_DATA; 
-- Insert ER_Attribute.png file data to image 
INSERT INTO CompanyImage(ImageBinary) 
SELECT * 
FROM   OPENROWSET(BULK 'E:\TutorialTips\sql\Images\ER_Attribute.png', SINGLE_BLOB) IMG_DATA; 
-- Select the data 
SELECT * FROM
  CompanyImage WITH (NOLOCK) 
Result: 
 
NOTE: 
We have use OPENROWSET with BULK mode to read the
  image data. BULK mode allows us to interpret and read the image data in
  a binary stream. This is where we take the advantage and insert the data
  as a binary stream into our table. 
The first example we shall look at queries inserting
  in column with VARBINARY data type using PNG image which is physically
  stored in E:\TutorialTips\sql\Images\ 
  path of SQL server machine. 
The second example we shall look at queries inserting
  in column with BINARY data type using PNG image which is physically
  stored in E:\TutorialTips\sql\Images\  
  path of SQL server machine. |  | |||||||||||||||||||||||||||||||||
 
This helps to understand binary data type usage. Thank You.
ReplyDeleteNice Post
ReplyDeleteMysq DBA Tutorial