En el Lenguaje C y sus derivados una cadena alfanumérica finaliza cuando se encuentra un carácter cuyo código ASCII es cero.

Firebird está escrito en el Lenguaje C++ que es un derivado del Lenguaje C entonces también para él una cadena finaliza cuando se encuentra un carácter cuyo código ASCII es cero.

Ejemplo:

INSERT INTO BANCOS
           (BAN_IDENTI, BAN_NOMBRE)
    VALUES (0, 'BANCO CENTRAL')

INSERT INTO BANCOS
           (BAN_IDENTI, BAN_NOMBRE)
    VALUES (0, 'BANCO ' || ASCII_CHAR(0) || ' NACIONAL')

Si ahora terminamos la transacción con un COMMIT y luego consultamos la tabla BANCOS esto es lo que veremos:

ASCII1

Captura 1. Si haces clic en la imagen la verás más grande

La primera fila está correcta, pero la segunda fila no. Como entre las palabras ‘BANCO’ y ‘NACIONAL’ se introdujo un carácter ASCII con el código cero entonces no se puede ver lo que se escribió a continuación de la palabra ‘BANCO’.

Para verificar que el problema lo tenemos porque hay un carácter que tiene el código ASCII cero, escribimos esta consulta:

SELECT
   *
FROM
   BANCOS
WHERE
   BAN_NOMBRE CONTAINING ASCII_CHAR(0)

Y este es el resultado que obtenemos:

ASCII2

Captura 2. Si haces clic en la imagen la verás más grande

 Donde como puedes ver nos muestra que en la columna BAN_NOMBRE de la segunda fila hay al menos un carácter con el código ASCII de cero.

Solucionando el problema

Afortunadamente este problema tiene una solución muy sencilla y es escribir un comando similar al siguiente:

UPDATE
   BANCOS
SET
   BAN_NOMBRE = REPLACE(BAN_NOMBRE, ASCII_CHAR(0), '')

Donde lo que hacemos es reemplazar el carácter problemático por otro carácter; en este caso por un carácter vacío.

Para verificar que nuestra actualización haya funcionado escribimos esta consulta:

SELECT
   *
FROM
   BANCOS

Y este es el resultado que obtenemos:

ASCII3

Captura 3. Si haces clic en la imagen la verás más grande

Y sí, funcionó. ¡¡¡Perfecto!!!

Ahora sí vemos los nombres completos de los dos Bancos.

El problema con los índices

Como ya hemos visto, si hay un carácter que tiene el código ASCII cero entonces eso impide que veamos los caracteres que se encuentran a continuación, pero ese no es el único problema que podemos tener.

Otro problema es que los índices que creemos en una columna que tiene caracteres ASCII cuyo código es cero, se corromperán.

Por lo tanto, si descubres que un índice está corrupto y no sabes el motivo, lo que puedes hacer es verificar si en esa columna hay algunos caracteres que tienen código ASCII cero. Si ese llegara a ser el caso entonces deberás eliminar todos esos caracteres problemáticos, de la forma mostrada más arriba. Así se solucionará el problema.

Un truco de protección:

Si queremos proteger el contenido de nuestras columnas y no queremos encriptarlas entonces podemos usar este truco: colocamos un carácter cuyo código ASCII es cero en alguna parte de la columna y todo lo que esté a continuación no será mostrado en los SELECTs. Es una protección sencilla pero muy efectiva ante quienes no dominan Firebird ni son hackers profesionales.

Conclusión:

Si no vemos todo el contenido de una columna puede ser que el problema se deba a que tiene insertados algunos caracteres cuyo código ASCII es cero. Esto es mucho más probable que ocurra cuando el contenido de esas columnas proviene de fuentes externas, por ejemplo de tablas .DBF, archivos de texto, tablas de Access, etc.

La solución es reemplazar a esos caracteres que tienen código ASCII cero con algún otro carácter, por ejemplo con el espacio vacío que se obtiene escribiendo dos apóstrofos, uno a continuación del otro.

Artículos relacionados:

El índice del blog Firebird21

El foro del blog Firebird21

Anuncios