En ocasiones el contenido de una tabla puede dañarse. Por ejemplo, porque primero grabaste algunas filas con un character set y luego cambiaste el character set de la tabla, por otro que es incompatible.

En tales casos al hacerle un SELECT a esa tabla, podrías ver un mensaje de error como el siguiente:

"Arithmetic overflow or division by zero has occurred.
arithmetic exception numeric overflow or string truncation
cannot transliterate character between character sets"

 

¿Por qué podría ocurrir algo así?

Porque el Firebird no verifica que el nuevo character set sea compatible con el anterior y que todas las filas de la tabla puedan ser traducidas (transliteradas). Eso, porque la tabla puede ser muy grande, tener millones y millones de filas, y hacer esa comprobación podría demorar mucho tiempo. Entonces, es tu responsabilidad asegurarte de que lo que estás haciendo está bien, pero … a veces podrías equivocarte.

¿Qué hacer en este caso?

Una posibilidad es tratar de recuperar todas las filas posibles, aquellas filas que aún pueden ser leídas. Esto puede ser algo tedioso pero … hay que hacerlo.

Podríamos crear una tabla que tenga exactamente la misma estructura que la tabla original, pero vacía, sin datos. Sus datos los iremos insertando por partes.

Ejemplo:

El mensaje de error te aparece luego de mostrarte 782 filas al ejecutar el Listado 1.

Listado 1.

SELECT
   ALU_NOMBRE
FROM
   ALUMNOS

Entonces para ir insertando en nuestra tabla auxiliar por partes podríamos escribir algo como:.

Listado 2.

INSERT INTO ALUMNOS2
   (ALU_NOMBRE)
SELECT
   ALU_NOMBRE
FROM
   ALUMNOS
ROWS
   1 TO 782

Lo que hicimos fue crear una tabla llamada ALUMNOS2 que tiene exactamente la misma estructura que la tabla ALUMNOS y luego le insertamos todas las filas que sabemos que están bien.

Listado 3.

INSERT INTO ALUMNOS2
   (ALU_NOMBRE)
SELECT
   ALU_NOMBRE
FROM
   ALUMNOS
ROWS
   784 TO 99999999

Como sabemos que la fila 783 tiene un error entonces en el Listado 3. salteamos hasta esa fila y nuestro INSERT empezará en la fila 784. Si el SELECT del Listado 3. también nos muestra un mensaje de error entonces vamos cambiando la cantidad del SKIP a 785, 786, 787, etc., hasta que podamos realizar el INSERT exitosamente.

De esta manera, aunque no recuperaremos todas las filas de la tabla ALUMNOS, sí podremos recuperar todas las filas que no tenían problemas.

Artículos relacionados:

El índice del blog Firebird21

El foro del blog Firebird21