Eliminando códigos de control en las cadenas alfanuméricas

4 comentarios

Como seguramente sabes, todos los caracteres que usas para escribir textos con la computadora tienen un código ASCII. Así por ejemplo el código ASCII de la letra A mayúscula es 65, el código ASCII del dígito 0 es 48, etc.

Los códigos ASCII cuyos valores van desde al 0 al 31 en su mayoría no son imprimibles y se llaman “códigos de control”.

Si una columna CHAR o VARCHAR tiene códigos de control entonces el resultado que obtendrás al ejecutar un SELECT o al utilizar funciones alfanuméricas tales como LEFT(), TRIM(), etc. podría no ser el esperado.

Entenderemos mejor el problema con el siguiente ejemplo.

Tenemos una tabla llamada PRODUCTOS la cual tiene las siguientes filas:

ASCII1

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

Ahora, reemplazamos todos los espacios en blanco por el código de control 0 (cero):

UPDATE
   PRODUCTOS
SET
   PRD_NOMBRE = REPLACE(PRD_NOMBRE, ' ', ASCII_CHAR(0))

Volvemos a consultar el contenido de la tabla PRODUCTOS y ahora esto es lo que obtenemos:

ASCII2

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

¿Qué pasó aquí? ¡¡¡Desaparecieron todos los caracteres que se encontraban después del primer espacio en blanco!!!

Pues no, no te asustes, no han desaparecido sino que no son visibles. Cuando el Firebird encuentra un caracter cuyo código ASCII es cero ya no muestra los siguientes caracteres, llega solamente hasta el que tiene código ASCII cero.

Entonces, si ahora actualizamos nuestra tabla PRODUCTOS de forma inversa (o sea, reemplazando los códigos ASCII cero con espacios en blanco):

UPDATE
   PRODUCTOS
SET
   PRD_NOMBRE = REPLACE(PRD_NOMBRE, ASCII_CHAR(0), ' ')

esto será lo que obtendremos:

ASCII1

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

¡¡¡Voilá!!! ¡¡¡Reaparecieron todos los caracteres faltantes!!!

Conclusión:

Si al consultar el contenido de una columna alfanumérica notas que faltan caracteres o que el comportamiento de las funciones alfanuméricas LEFT(), RIGHT(), TRIM(), etc., es extraño entonces es posible que la causa sea que hay caracteres de control en esa columna. Puedes utilizar la función REPLACE() para reemplazar a esos caracteres de control por otros caracteres, típicamente por espacios en blanco, como has visto en los ejemplos anteriores y de esa manera solucionarás el problema.

Artículo relacionado:

El índice del blog Firebird21

Anuncios

SQL error code = -104: Unexpected end of command

1 comentario

El mensaje de error “Unexpected end of command” significa que el comando terminó imprevistamente, antes de lo esperado. O sea que no debería haber terminado, pero terminó.

Ejemplo 1

SELECT
   *
FROM

En el Ejemplo 1 faltó especificar el nombre de la tabla. El Firebird no es adivino y no puede saber cual tabla querías usar.

Ejemplo 2

SELECT
   *
FROM
   PRODUCTOS
WHERE

En el Ejemplo 2 no se especificó la condición (la cual tendría que haberse escrito después de la cláusula WHERE). El Firebird no puede saber cual condición querías escribir.

Ejemplo 3

SELECT
   *
FROM
   PRODUCTOS
WHERE
   PRD_NOMBRE LIKE 'CO

En el Ejemplo 3 faltó escribir un apóstrofo. Se escribió uno después del LIKE, falta el otro.

Ejemplo 4

INSERT INTO PRODUCTOS

En el Ejemplo 4 faltó indicar las columnas de la tabla de PRODUCTOS y los valores que se guardarán en esas columnas.

Conclusión:

Como puedes ver, en todos los casos faltó escribir algo. Si te encuentras con este error, revisa detenidamente el comando que escribiste porque algo le está faltando para estar completo.

Artículo relacionado:

El índice del blog Firebird21