binary y varbinary (Transact-SQL)
Tipos de datos binarios de longitud fija o variable.
binary [ ( n ) ]
Datos binarios de longitud fija con una longitud de n bytes, donde n es un valor que oscila entre 1 y 8.000. El tamaño de almacenamiento es de n bytes.varbinary [ ( n | max) ]
Datos binarios de longitud variable. n puede ser un valor de 1 a 8.000. max indica que el tamaño máximo de almacenamiento es de 2^31-1 bytes. El tamaño de almacenamiento es la longitud real de los datos especificados + 2 bytes. Los datos especificados pueden tener una longitud de 0 bytes. El sinónimo de ANSI SQL para varbinary es binary varying.
Comentarios
Cuando no se especifica el argumento n en una instrucción de definición de datos o de declaración de variable, la longitud predeterminada es 1. Cuando no se especifica n con la función CAST, la longitud predeterminada es 30.
Utilice binary cuando los tamaños de las entradas de datos de columna sean coherentes.
Use varbinary cuando los tamaños de las entradas de datos de columna varíen considerablemente.
Use varbinary(max) cuando las entradas de datos de columna superen los 8.000 bytes.
Convertir datos binary y varbinary
Cuando se convierten datos de un tipo de datos de cadena (char, varchar, nchar, nvarchar, binary, varbinary, text, ntext o image) a un tipo de datos binary o varbinary de diferente longitud, SQL Server rellena o trunca los datos de la derecha. Cuando se convierten a binary o varbinary otros tipos de datos, los datos se rellenan o se truncan por la izquierda. El relleno se realiza con ceros hexadecimales.
La conversión de datos a tipos de datos binary y varbinary es útil si el dato binary es la forma más sencilla de mover datos. Cuando se convierte un valor de cualquier tipo a un valor binario de tamaño suficiente y, a continuación, se convierte de nuevo al tipo original, el resultado será el mismo valor si ambas conversiones utilizan la misma versión de SQL Server. La representación binaria de un valor puede cambiar entre versiones de SQL Server.
Puede convertir tipos de datos int, smallint y tinyint a binary o varbinary, pero si convierte de nuevo el valor binary a un valor entero, este será distinto del valor entero original si se ha producido un truncamiento. Por ejemplo, la siguiente instrucción SELECT muestra que el valor entero 123456 se almacena normalmente como un valor 0x0001e240 binario:
SELECT CAST( 123456 AS BINARY(4) );
Sin embargo, en la siguiente instrucción SELECT se muestra que, si el destino de tipo binary es demasiado pequeño para contener el valor completo, los dígitos a la izquierda se truncarán sin avisar; de esta forma, el mismo número se almacena como 0xe240:
SELECT CAST( 123456 AS BINARY(2) );
El siguiente lote muestra que este truncamiento puede afectar a las operaciones aritméticas sin generar un error:
DECLARE @BinaryVariable2 BINARY(2);
SET @BinaryVariable2 = 123456;
SET @BinaryVariable2 = @BinaryVariable2 + 1;
SELECT CAST( @BinaryVariable2 AS INT);
GO
El resultado final es 57921 y no 123457.
[!NOTA]
No se garantiza que las conversiones entre cualquier tipo de datos y los tipos de datos binary sean las mismas entre diferentes versiones de SQL Server.