Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Codificações do conjunto de caracteres e fatores de tamanho de armazenamento


A menos que você esteja interessado apenas na mudança máxima, seu exemplo não está correto.

AL32UTF8 é um conjunto de caracteres de comprimento variável. Falando em termos gerais, qualquer caractere que esteja no conjunto de caracteres US7ASCII terá 1 byte, caracteres europeus geralmente exigem 2 bytes, vários caracteres de idiomas asiáticos exigem 3 bytes e alguns caracteres muito raros exigirão 4 bytes. Realisticamente, se você estiver falando sobre a conversão de dados WE8ISO8859P1 reais para AL32UTF8, geralmente verá na prática um fator de conversão entre 1 e 2 que é muito mais próximo de 1 do que de 2. Sem procurar o mapeamento Unicode para cada caractere WE8ISO8859P1 válido , eu ficaria surpreso se algum necessário 3 ou 4 bytes de armazenamento no conjunto de caracteres AL32UTF8.

No Globalization Support Guide, há uma seção sobre conjuntos de caracteres que informa quais conjuntos de caracteres são de byte único, quais são de vários bytes e quais conjuntos de caracteres de vários bytes são de largura fixa. Quase todos os conjuntos de caracteres de vários bytes são de largura variável, portanto, o fator que você está procurando dependerá de seus dados.

Na maioria dos casos, é melhor declarar suas colunas para usar semântica de comprimento de caractere em vez de semântica de comprimento de byte, deixando o banco de dados descobrir nos bastidores quantos dados alocar. Por exemplo, se você declarar uma coluna
CREATE TABLE foo (
  col1 VARCHAR2(10 CHAR)
)

A Oracle alocará espaço para 10 caracteres de armazenamento independentemente do conjunto de caracteres do banco de dados e independentemente do número real de bytes necessários para armazenar esses dados (sujeito ao limite de 4000 bytes por VARCHAR2 coluna). Isso geralmente torna a definição dos tamanhos das colunas muito mais fácil porque você não precisa superdimensionar as colunas caso alguém decida lançar 10 caracteres UTF-8 de 4 bytes em uma linha e você não precisa explicar aos usuários que a coluna aceitará seqüências de diferentes números de caracteres, dependendo do idioma e/ou dos caracteres específicos escolhidos.

Embora o pessoal da Oracle que lida com a globalização regularmente desencoraje isso , preferindo especificar explicitamente a semântica do comprimento do caractere ao declarar suas colunas ou pelo menos apenas defini-la no nível da sessão, defina o NLS_LENGTH_SEMANTICS parâmetro de inicialização para causar VARCHAR2(10) para usar semântica de comprimento de caractere em vez de semântica de comprimento de byte por padrão (você ainda pode especificar VARCHAR2(10 BYTE) se você quiser semântica de comprimento de byte).