sql >> Base de Datos >  >> RDS >> Oracle

La longitud máxima de VARCHAR es 4000 pero solo se puede almacenar texto tailandés de 2666 bytes

El problema

Al describir un VARCHAR, debe proporcionar una unidad, p. VARCHAR2(200 BYTE) o VARCHAR2(200 CHAR) . Si omite la unidad, el valor predeterminado es BYTE (consulte Conceptos de bases de datos de Oracle, capítulo Tipos de datos de Oracle ). Esto parece ser un detalle menor, pero se vuelve bastante grave cuando tiene conjuntos de caracteres de varios bytes.

Situación hasta 11g

Desafortunadamente, existe un límite estricto en el tamaño máximo de una columna VARCHAR2. Son 4000 BYTE (!) (consulte Referencia de la base de datos de Oracle, capítulo Tipos de datos de Oracle ) hasta Oracle 11g y . Este es un límite estricto y no hay forma de evitarlo. La única forma de evitar esto es una columna CLOB.

Solución para 12c

La situación es diferente en Oracle 12c. Allí puedes usar el parámetro MAX_STRING_SIZE = EXTENDED para aumentar el límite hasta 32767 BYTE (consulte Referencia del lenguaje de base de datos de Oracle, capítulo Tipos de datos y Oracle Database Reference, capítulo Parámetros de inicialización ). Entonces, la solución obvia es:actualice a Oracle 12c, configure MAX_STRING_SIZE = EXTENDED según la documentación y modifique la definición de su tabla. Es posible que pierda algunos índices al modificar su tabla, porque antes de 12c, los índices no podían contener valores VARCHAR2 con más de 4000 BYTE y aún podría haber alguna limitación. (Tengo que verificar el problema con los índices y si se puede solucionar reconstruyendo los índices).

Solución:cambiar la codificación de la base de datos

Puede intentar cambiar la codificación de su base de datos nativa (la forma en que su base de datos asigna CHAR a BYTE). Para esto, generalmente debe crear una nueva base de datos y proporcionar un parámetro apropiado para NLS_CHARACTERSET. Este es un cambio muy grande en la forma en que opera su base de datos y puede tener varios efectos secundarios. Si alguna vez intenta agregar caracteres en una codificación diferente, es posible que no tenga suerte (es decir, no puede almacenarlos en su base de datos). Así que no recomendaría esta solución.

Solución:Cambiar a CLOB

Por lo general, no es necesario proporcionar consultas arbitrarias en campos de texto tan grandes. Puede intentar identificar las consultas seleccionando en la columna de texto grande y migrarlas a Oracle Text en una columna CLOB. Pero este es un cambio muy grande y podría no ser posible con su esquema existente o su aplicación. Es posible que termine con un montón de disparadores "EN LUGAR DE" y con algunas comprobaciones de restricciones faltantes (que involucran la columna CLOB recién creada).

Solución:Usar XML

En lugar de un CLOB, podría intentar almacenar su cadena como una columna XML. El tamaño máximo para estos es de 4 GB. Perjudicará su rendimiento, tendrá que proporcionar disparadores EN LUGAR DE y es posible que pierda algunas restricciones, pero podría funcionar para usted.