Las letras BLOB significan: Binary Large OBject o en castellano: objetos binarios de gran tamaño.

Se refieren a un tipo de datos que podemos utilizar cuando declaramos una columna de una tabla.

¿Para qué se usan las columnas de tipo BLOB?

Para guardar objetos cuyo tamaño es o puede ser muy grande, por ejemplo:

  • Archivos de texto muy grandes
  • Documentos (.DOC, .PDF, etc.)
  • Hojas de cálculo (.XLS, etc.)
  • Gráficos y fotografías (.CAD, .CRW, .GIF, .JPG, .PNG, .TIFF, etc.)
  • Canciones y música (.MID, .MP3, .WAV, .WMA, etc.)
  • Vídeos (.AVI, .FLV, .MP4, .RMVB, WMV, etc.)
  • Páginas web (.HTM, .HTML, .CSS, etc.)
  • Y cualquier otro archivo

El tamaño de los archivos que se puede guardar en una columna de tipo BLOB es muy grande, no es ilimitada, pero sí muy grande.

¿Cuál es el tamaño máximo que puede tener un archivo que se guarda en una columna de tipo BLOB?

Eso depende del tamaño de la página de tu Base de Datos. La escala es la siguiente:

1 Kb —> 64 Mb

2 Kb —> 512 Mb

4 Kb —> 4 Gb (4.096 Mb)

8 Kb —> 32 Gb (32.768 Mb)

16 Kb —> 256 Gb (262.144 Mb)

Si usas Firebird 2.5 ó posterior se recomienda que el tamaño de las páginas de tus bases de datos sea de 4 Kb o más. Eso implica que cada archivo que guardes en una columna de tipo BLOB podrá tener un tamaño de 4Gb o más. Lo cual es más que suficiente para casi todos los casos porque ese tamaño es para cada archivo guardado, tus tablas pueden tener cientos o miles de archivos cada uno de ellos pesando varios Gigabytes.

¿Es preferible guardar el enlace a un archivo o el archivo mismo?

Las columnas de tipo BLOB te permiten guardar al archivo entero pero ¿cuál de esas alternativas es mejor?

  1. En la tabla guardar el enlace a un archivo
  2. En la tabla guardar el archivo completo

En Firebird se recomienda la opción 2. por las siguientes razones:

  • Cuando haces un backup también copias el archivo
  • Si se guarda el enlace al archivo entonces cualquiera podría borrarlo o modificarlo
  • Si se guarda el enlace al archivo no podrías saber quien lo agregó, lo modificó o lo borró

¿Se pueden usar funciones con las columnas de tipo BLOB?

Sí, si el contenido de una columna de tipo BLOB es texto entonces puedes usar las funciones de string, tales como CAST(), LOWER(), UPPER(), TRIM(), SUBSTRING(), etc. en esa columna. También las podrás concatenar y asignar a variables locales dentro de un stored procedure o de un trigger.

¿Se puede filtrar el contenido de las columnas de tipo BLOB?

Sí, puedes usar las cláusulas LIKE y CONTAINING en tu SELECT.

¿Se puede ordenar una consulta por una columna de tipo BLOB?

No, eso no puede hacerse, por la forma en que internamente están estructurados los índices del Firebird no es posible ordenar las columnas de tipo BLOB de acuerdo a su contenido. Eso implica que no puedes usar la cláusula ORDER BY.

Resumiendo:

  • Se puede usar la cláusula WHERE con una columna de tipo BLOB
  • No se puede usar la cláusula ORDER BY con una columna de tipo BLOB

¿Es rápido o es lento consultar columnas de tipo BLOB?

En general es bastante rápido pero si no estás seguro de que necesitarás el archivo lo recomendable es no especificarlo en la consulta. O sea que lo correcto es escribir:

SELECT
   PRD_CODIGO,
   PRD_NOMBRE
FROM
   PRODUCTOS

Y escribir algo como:

SELECT
   PRD_CODIGO,
   PRD_NOMBRE,
   PRD_FOTOGR
FROM
   PRODUCTOS

 Solamente cuando estás seguro de que necesitarás obtener la fotografía del producto.

¿Qué es el subtipo de una columna de tipo BLOB?

Es un número o una palabra que nos dice cual puede ser el contenido de esa columna, o sea que es lo que se puede guardar en esa columna.

Subtipo 0   —> se puede guardar cualquier cosa que se desee

Subtipo 1 —> se puede guardar texto

Subtipo Text —> es lo mismo que Subtipo 1, es un sinónimo

Número positivo —> reservado para uso futuro por el Firebird

Número negativo —> el usuario (o sea, nosotros) puede definir el subtipo

¿Se puede tener un dominio de tipo BLOB?

Sí, por supuesto, BLOB es un tipo de datos por lo tanto podemos tener dominios de ese tipo de datos, ejemplo:

CREATE DOMAIN
   D_COMENTARIOS
AS
   BLOB SUB_TYPE 1;

Entonces, si una columna se declara con el dominio D_COMENTARIOS en esa columna se podrán escribir millones de palabras, más que suficientes para cualquier comentario que el usuario pueda necesitar alguna vez.

¿Cómo se utilizan los subtipos del usuario?

Como ya sabes, si un subtipo tiene un número negativo entonces es un subtipo del usuario, y por lo tanto es el usuario quien decide que guardar en las columnas de tipo BLOB y de un subtipo negativo.

Por ejemplo, un usuario puede decir:

  • “el subtipo -1 lo usaré para guardar archivos .PDF”
  • “el subtipo -2 lo usaré para guardar archivos .DOC”
  • “el subtipo -3 lo usaré para guardar archivos .XLS”

Pero el Firebird no sabe eso (ni le interesa), el Firebird simplemente guarda los archivos y se los envía al Cliente cuando éste se los pide. Nada más que eso.

Por consiguiente es total responsabilidad del usuario saber lo que está guardando en cada subtipo negativo.

¿Y qué ocurre si no se especifica el subtipo?

Especificar el subtipo es opcional, no es obligatorio. Si no se especifica el Firebird lo trata como si fuera de subtipo 0, o sea datos de tipo binario.

Artículo relacionado:

El índice del blog Firebird21