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

Codificaciones de conjuntos de caracteres y factores de tamaño de almacenamiento

A menos que solo esté interesado en el cambio máximo, su ejemplo no es correcto.

AL32UTF8 es un conjunto de caracteres de longitud variable. Hablando en términos generales, cualquier carácter que esté en el conjunto de caracteres US7ASCII ocupará 1 byte, los caracteres europeos generalmente requieren 2 bytes, varios caracteres de idiomas asiáticos requieren 3 bytes y algunos caracteres muy raros requieren 4 bytes. Siendo realistas, si está hablando de convertir datos WE8ISO8859P1 reales a AL32UTF8, generalmente verá en la práctica un factor de conversión entre 1 y 2 que está mucho más cerca de 1 que de 2. Sin buscar el mapeo Unicode para cada carácter WE8ISO8859P1 válido , me sorprendería si alguno requiriera 3 o 4 bytes de almacenamiento en el juego de caracteres AL32UTF8.

En la Guía de soporte de globalización, hay una sección sobre conjuntos de caracteres eso le dice qué conjuntos de caracteres son de un solo byte, cuáles son de varios bytes y cuáles de los conjuntos de caracteres de varios bytes tienen un ancho fijo. Casi todos los conjuntos de caracteres de varios bytes son de ancho variable, por lo que el factor que busca dependerá de sus datos.

En la mayoría de los casos, es mejor declarar sus columnas para usar la semántica de longitud de caracteres en lugar de la semántica de longitud de bytes de todos modos, dejando que la base de datos descubra entre bastidores cuántos datos asignar. Por ejemplo, si declara una columna

CREATE TABLE foo (
  col1 VARCHAR2(10 CHAR)
)

Oracle asignará espacio para 10 caracteres de almacenamiento, independientemente del conjunto de caracteres de la base de datos y del número real de bytes necesarios para almacenar esos datos (sujeto al límite de 4000 bytes por VARCHAR2 columna). Eso generalmente hace que definir los tamaños de columna sea mucho más fácil porque no tiene que sobredimensionar las columnas en caso de que alguien decida colocar 10 caracteres UTF-8 de 4 bytes en una fila y no tiene que explicar a los usuarios que la columna aceptará cadenas de diferente número de caracteres según el idioma y/o los caracteres específicos elegidos.

Aunque la gente de Oracle que se ocupa de la globalización de forma habitual la desaconseja , si prefiere que especifique explícitamente la semántica de la longitud de los caracteres cuando declara sus columnas o, al menos, solo lo establezca a nivel de sesión, puede establecer el NLS_LENGTH_SEMANTICS parámetro de inicialización para causar VARCHAR2(10) para usar la semántica de longitud de caracteres en lugar de la semántica de longitud de bytes de forma predeterminada (todavía puede especificar VARCHAR2(10 BYTE) si desea una semántica de longitud de byte).