Perguntas Frequentes

Abrir tudo Fechar tudo
  • Fundamentos dos Parâmetros NLS_LANG

    Um código de idioma é um conjunto de informações que abordam requisitos linguísticos e culturais que correspondem a um determinado idioma e país. Tradicionalmente, os dados associados a um código de idioma fornecem suporte para formatação e análise de datas, horas, números, moedas etc. O fornecimento de dados de código de idioma atuais e corretos historicamente é de responsabilidade de cada proprietário ou fornecedor da plataforma, levando a inconsistências e erros nos dados de localidade.

    Definir o parâmetro do ambiente NLS_LANG é a maneira mais simples de especificar o comportamento da localidade para o software Oracle. Ele define o idioma e o território usados pelo aplicativo cliente e pelo servidor de banco de dados. Também indica o conjunto de caracteres do cliente, que corresponde ao conjunto de caracteres dos dados a serem inseridos ou exibidos por um programa cliente.

    NLS_LANG é definido como uma variável de ambiente local nas plataformas UNIX. NLS_LANG é definido no registro nas plataformas Windows.

    O parâmetro NLS_LANG possui três componentes: idioma, território e conjuntos de caracteres. Especifique no seguinte formato, incluindo a pontuação:
    NLS_LANG = language_territory.charset

    Cada componente do parâmetro NLS_LANG controla a operação de um subconjunto de recursos de suporte à globalização:

    Idioma
    Especifica convenções como o idioma usado para mensagens da Oracle, classificação, nomes de dias e nomes de meses. Cada idioma suportado possui um nome exclusivo; por exemplo, AMERICANO, FRANCÊS ou ALEMÃO. O argumento idioma especifica valores padrão para o território e os argumentos do conjunto de caracteres. Se o idioma não for especificado, o valor padrão será AMERICANO

    Território
    especifica convenções como a data padrão, os formatos monetário e numérico. Cada território suportado possui um nome exclusivo, como, por exemplo, AMÉRICA, FRANÇA ou CANADÁ. Se o território não for especificado, o valor será derivado do valor do idioma.

    Conjunto de caracteres
    especifica o conjunto de caracteres usado pela aplicação cliente (normalmente o conjunto de caracteres Oracle que corresponde ao conjunto de caracteres do terminal do usuário ou o conjunto de caracteres do SO). Cada conjunto de caracteres suportado possui um acrônimo exclusivo, por exemplo, US7ASCII, WE8ISO8859P1, WE8DEC, WE8MSWIN1252 ou JA16EUC. Cada idioma tem um conjunto de caracteres padrão associado a ele.

    Observação:

    Todos os componentes da definição NLS_LANG são opcionais; qualquer item que não esteja especificado utiliza o valor padrão. Se você especificar território ou conjunto de caracteres, deverá incluir o delimitador [sublinhado (_) para demarcar o território, ponto final (.) para demarcar o conjunto de caracteres]. Caso contrário, o vaor é processado como a identificação de um idioma.

    Por exemplo, para configurar somente o território do NLS_LANG, você pode usar o seguinte formato: NLS_LANG=_JAPAN

    O restante deste documento se concentrará no componente charset da configuração NLS_LANG, pois é a peça menos compreendida e mais importante a ser definida corretamente.

  • Mitos Comuns sobre NLS_LANG
    • Definir o NLS_LANG para o conjunto de caracteres do banco de dados PODE estar correto, mas muitas vezes NÃO está correto. NÃO presuma que NLS_LANG precise ser o mesmo que o conjunto de caracteres do banco de dados. MUITAS VEZES ISSO NÃO É VERDADE.
    • O conjunto de caracteres definido com o parâmetro NLS_LANG NÃO ALTERA o conjunto de caracteres do cliente. É usado para permitir que a Oracle saiba qual conjunto de caracteres você ESTÁ USANDO no lado do cliente, para que a Oracle possa fazer a conversão correta. Você não pode alterar o conjunto de caracteres do seu cliente usando um NLS_LANG diferente!
    • Se você não definir o NLS_LANG no cliente, ele usará o NLS_LANG do servidor. Isso também NÃO é verdade! Por exemplo, se o Oracle Installer não preencher NLS_LANG e não estiver definido de outra forma, seu valor por padrão será AMERICAN_AMERICA.US7ASCII. O idioma é AMERICANO, o território é AMÉRICA e o conjunto de caracteres é US7ASCII.
    • A configuração dos parâmetros LANGUAGE (IDIOMA) e TERRITORY (TERRITÓRIO) de NLS_LANG não tem nada a ver com a capacidade de armazenar caracteres em um banco de dados. Um NLS_LANG definido como JAPANESE_JAPAN.WE8MSWIN1252 não permitirá que você armazene japonês, pois WE8MSWIN1252 não suporta caracteres japoneses. No entanto, um NLS_LANG definido como AMERICAN_AMERICA.JA16SJIS permitirá que você armazene japonês, desde que os dados de entrada sejam verdadeiramente JA16SJIS e se o banco de dados também estiver em um conjunto de caracteres que possa armazenar japonês como UTF8 ou JA16SJIS)
  • Verificação da Configuração NLS_LANG atual

    Em muitos casos, o NLS_LANG já foi definido durante a instalação da Oracle ou posteriormente de forma manual. Para ter certeza de que você pode usar esses métodos para recuperar o valor de NLS_LANG para SQL*Plus:

    Em UNIX:

    SQL> HOST ECHO $NLS_LANG

    Isso retorna o valor do parâmetro.

    No Windows:
    No Windows, você tem duas opções possíveis, normalmente o NLS_LANG é definido no registro, mas também pode ser definido no ambiente, mas isso geralmente não é feito. O valor no ambiente tem precedência sobre o valor no registro e é usado para ALL Oracle_Homes no servidor. Observe também que qualquer variável de ambiente USER (USUÁRIO) tem precedência sobre qualquer variável de ambiente SYSTEM (SISTEMA) (esse é o comportamento do Windows e não tem nada a ver com Oracle) se definido

    Para verificar se está definido no ambiente:

    SQL> HOST ECHO %NLS_LANG%

    Caso isso reporte apenas % NLS_LANG%, a variável não estará configurada no ambiente.

    Se estiver definido, será informado algo como

    ENGLISH_UNITED KINGDOM.WE8ISO8859P1
    Caso NLS_LANG não esteja definido no ambiente, verifique o valor inserido no registro:

    SQL>@.[%NLS_LANG%].

    Caso o resultado seja algo parecido com:
    Não foi possível abrir arquivo.[ENGLISH_UNITED KINGDOM.WE8ISO8859P1].
    O "nome do arquivo" entre chaves é o valor do parâmetro do registro.

    Caso seja retornado a seguinte mensagem:
    Impossível abrir o arquivo ".[% NLS_LANG%]." o parâmetro NLS_LANG também não está definido no registro.

    Observe que a técnica @.[% NLS_LANG%]. relata o NLS_LANG conhecido pelo executável SQL*Plus, ela não lê o registro em si. Mas se você executar o comando HOST primeiro e o NLS_LANG não estiver definido no ambiente, pode ter certeza de que a variável estará definida no registro se o @.[% NLS_LANG%]. retornar um valor válido.

    Todos os outros parâmetros NLS podem ser recuperados por:

    SELECT * FROM NLS_SESSION_PARAMETERS;

    Observação:

    SELECT USERENV ('language') FROM DUAL; dá o <Language>_<territory> da sessão, mas o conjunto de caracteres DATABASE não é o cliente, portanto, o valor retornado não é o da configuração NLS_LANG completa do cliente!

  • A Prioridade dos Parâmetros NLS Relacionados ao NLS_LANG

    Esta seção explica a ordem em que os parâmetros NLS são levados em consideração no modelo de cliente/servidor de banco de dados. (Isso NÃO cobre conexões JDBC Finas)

    Existem 3 nívels para configurar os parâmetros do NLS: Banco de dados, Instância e Sessão. Se um parâmetro é definido em mais de um nível, as regras sobre as quais prevalece são bastante diretas:

    1. 1. As configurações NLS do banco de dados são substituídas pelas configurações da instância NLS
    2. 2 O banco de dados NLS e as configurações de instância NLS são substituídas pelas configurações da sessão do NLS
  • Parâmetros da Sessão
    SELECT * from NLS_SESSION_PARAMETERS;

    Essas são as configurações usadas para a sessão SQL atual.

    Elas refletem (nesta ordem):

    1. 1) Os valores dos parâmetros de NLS definidos por "ALTER SESSION "
      ALTER SESSION set NLS_DATE_FORMAT = 'DD/MM/YYYY';
    2. 2) Se não houver declaração "ALTER SESSION " explícita, ela refletirá a configuração do parâmetro NLS correspondente no cliente derivado da variável NLS_LANG.
    3. 3) Se NLS_LANG for especificado com uma única parte, AMERICAN será atribuído por padrão.

      Portanto, se você definir NLS_LANG=_BELGIUM. WE8MSWIN1252, você obtém o seguinte:

      VALOR DO PARÂMETRO

      NLS_LANGUAGE AMERICAN
      NLS_TERRITORY BELGIUM
      NLS_CURRENCY <euro sign here>
      NLS_ISO_CURRENCY BELGIUM

      Observação:

      A diferença entre NLS_LANG=_BELGIUM.WE8MSWIN1252 (correto) e

      NLS_LANG=BELGIUM.WE8MSWIN1252 (incorreto), é que você precisa configurar "_" como separador.

    4. 4) Se NLS_LANG for especificado com uma única parte, o padrão será atribuído de acordo com as configurações estabelecidas.

      Portanto, se você definir NLS_LANG=ITALIAN_.WE8MSWIN1252, obterá o seguinte:

      VALOR DO PARÂMETRO

      NLS_LANGUAGE ITALIAN
      NLS_TERRITORY ITALY
      NLS_CURRENCY <euro sign here>
      NLS_ISO_CURRENCY ITALY

      Observação:

      Observe a diferença entre NLS_LANG=ITALIAN_.WE8MSWIN1252 (correto) e

      NLS_LANG=ITALIAN.WE8MSWIN1252 (incorreto), você precisa configurar "_" como separador.

    5. 5) Se NLS_LANG for especificado sem o _ part, então padrão para _ part será AMERICAN_AMERICA.

      Portanto, se você definir NLS_LANG=.WE8MSWIN1252, obterá o seguinte:

      VALOR DO PARÂMETRO

      NLS_LANGUAGE AMERICAN
      NLS_TERRITORY AMERICA
      NLS_CURRENCY $
      NLS_ISO_CURRENCY AMERICA

      Note:
      
      The difference between NLS_LANG=.WE8MSWIN1252 (correct) and
      
      NLS_LANG=WE8MSWIN1252 (incorrect), you need to set the "." as separator.
    6. 6) Se o NLS_LANG estiver definido (seja um dos itens 3, 4 ou 5), os padrões parecidos com

      NLS_SORT, NLS_DATE_FORMAT etc. podem ser configurados como "uma configuração separada" e substituirão os padrões derivados de NLS_LANG _ part.

      Portanto, se você definir NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252 e NLS_ISO_CURRENCY=FRANCE, obterá o seguinte:

      VALOR DO PARÂMETRO

      NLS_LANGUAGE AMERICAN
      NLS_TERRITORY AMERICA
      NLS_CURRENCY $
      NLS_ISO_CURRENCY FRANCE

      Padrões:
      * Se NLS_DATE_LANGUAGE ou NLS_SORT não estiver definido, será derivado da
      NLS_LANGUAGE.
      * Se NLS_CURRENCY, NLS_DUAL_CURRENCY, NLS_ISO_CURRENCY, NLS_DATE_FORMAT, NLS_TIMESTAMP_FORMAT, NLS_TIMESTAMP_TZ_FORMAT, NLS_NUMERIC_CHARACTERS não estão definidos, eles estão definidos a partir do NLS_TERRITORY

    7. 7) Se o NLS_LANG não tiver nenhum valor definido, o padrão será

      <Language>_<Territory>.US7ASCII e os valores para
      <Language>_<Territory> serão aqueles encontrados em

      NLS_INSTANCE_PARAMETERS. Parâmetros como NLS_SORT definidos como "separados" no lado do cliente são ignorados.

      Note:
      
      * If set, client parameters (NLS_SESSION_PARAMETERS) always take precedence over NLS_INSTANCE_PARAMETERS and NLS_DATABASE_PARAMETERS.
      
      * This behavior cannot be disabled on/from the server, so a parameter set on the client always has precedence above an instance or database parameter.
      
      * NLS_LANG cannot be changed by ALTER SESSION, NLS_LANGUAGE and NLS_TERRITORY can. However NLS_LANGUAGE and /or NLS_TERRITORY cannot be set as "standalone" parameters in the environment or registry on the client.
      
      * NLS_SESSION_PARAMETERS is NOT visible for other sessions. If you need to trace this then you have to use a logon trigger to create your own logging table (based on session parameters)
      
      * The <clients characterset> part of NLS_LANG is NOT shown in any system table or view.
      
      * On Windows you have two possible options, normally the NLS_LANG is set in the registry, but it can also be set in the environment, however this is not often done and generally not recommended to do so. The value in the environment takes precedence over the value in the registry and is used for ALL Oracle_Homes on the server if defined as a system environment variable.
      
      * NLS_LANGUAGE in the session parameters also declares the language for the client error messages.
      
      * You cannot "set" a NLS parameter in an SQL script; you need to use ALTER SESSION.
  • Parâmetros de Instância
    SELECT * from NLS_INSTANCE_PARAMETERS;

    Essas são as configurações no init.ora do banco de dados no momento em que o banco de dados foi iniciado ou definido por ALTER SYSTEM.

    Se o parâmetro não estiver explicitamente definido no init.ora ou definido pelo ALTER SYSTEM, seu valor NÃO será derivado de um parâmetro "superior" (estamos falando de parâmetros como NLS_SORT que derivam um padrão de NLS_LANGUAGE em NLS_SESSION_PARAMETERS, esse NÃO é o caso de NLS_INSTANCE_PARAMETERS)

    Note:
    
    * NLS_LANG is not an init.ora parameter; NLS_LANGUAGE and NLS_TERRITORY are so you need to set NLS_LANGUAGE and NLS_TERRITORY separately.
    
    * You cannot define the  or NLS_LANG in the init.ora
    
    The client characterset is defined by the NLS_LANG on the client OS (see above).
    
    * You cannot define the database characterset in the init.ora. The database characterset is defined by the "Create Database" command.
    
    * These settings take precedence above the NLS_DATABASE_PARAMETERS.
    
    * These values are used for the NLS_SESSION_PARAMETERS if the client the
    
    NLS_LANG is NOT set.
    
    * Oracle strongly recommends that you set the NLS_LANG on the client at least to
    
    NLS_LANG=.<clients characterset>
    
    * The NLS_LANGUAGE in the instance parameters also declares the language for the server error messages in alert.log and in trace files.
  • Parâmetros do Banco de dados
    SELECT * from NLS_DATABASE_PARAMETERS;

    O padrão é AMERICAN_AMERICA se não houver parâmetros definidos explicitamente no init.ora durante o tempo de criação do banco de dados. Se houver parâmetros configurados no init.ora durante a criação do banco de dados, você os verá aqui. Não há como alterá-los após a criação do banco de dados. NÃO tente atualizar as tabelas do sistema para ignorar essas configurações! Essas configurações são usadas para fornecer ao banco de dados um padrão se os parâmetros INSTANCE e SESSION não estiverem definidos.

    Observação:

    * NLS_LANG não é um parâmetro init.ora, NLS_LANGUAGE e NLS_TERRITORY são.

    Portanto, você precisa definir NLS_LANGUAGE e NLS_TERRITORY separadamente.

    * Esses parâmetros são substituídos por NLS_INSTANCE_PARAMETERS e NLS_SESSION_PARAMETERS.

    * Você não consegue definir o conjunto de <clients > ou NLS_LANG no init.ora. O conjunto de caracteres do cliente é definido pelo NLS_LANG no SO do cliente.

    * Você não pode definir o conjunto de caracteres do banco de dados no init.ora.

    O conjunto de caracteres (nacional) do banco de dados NLS_(NCHAR)_CHARACTERSET) é definido pelo comando "Create Database".

    * Os parâmetros NLS_CHARACTERSET e NLS_NCHAR_CHARACTERSET não podem ser substituídos pelos parâmetros de instância ou sessão.

    Eles são definidos pelo valor especificado no comando "CREATE DATABASE" e não devem ser alterados posteriormente de forma dinâmica. NÃO atualize as tabelas do sistema para alterar o conjunto de caracteres. Isso pode corromper seu banco de dados e potencialmente tornar impossível abrir o banco de dados novamente.

    * A configuração do NLS_LANG durante a criação do banco de dados não influencia o NLS_DATABASE_PARAMETERS.

    * O NLS_LANG definido durante a criação do banco de dados NÃO tem impacto no Conjunto de caracteres Nacionais do banco de dados.

    Comandos SELECT adicionais:
    A) SELECT name,value$ from sys.props$ onde nome como '%NLS%';
    Isso fornece as mesmas informações de NLS_DATABASE_PARAMETERS.
    Você deve usar NLS_DATABASE_PARAMETERS em vez de props$.
    Observe o UPPERCASE '% NLS%'

    B) SELECT * from v$nls_parameters;
    Essa consulta retorna os parâmetros da sessão atual e o conjunto de caracteres *DATABASE*, conforme retornados pelo comando NLS_DATABASE_PARAMETERS.

    C) SELECT name,value from v$parameter where name like '%NLS%';
    Essa consulta retorna as mesmas informações de NLS_INSTANCE_PARAMETERS.
    Observe o LOWERCASE '% NLS%'

    D) SELECT userenv ('language') from dual;
    and
    SELECT sys_context('userenv','language') from dual;
    Esses dois comandos SELECT dão o _ da sessão e o
    conjunto de caracteres DATABASE. O conjunto de caracteres do banco de dados não é igual ao conjunto de caracteres do NLS_LANG com o qual você iniciou esta conexão! Não se deixe enganar, embora a saída desta consulta pareça o valor de uma variável NLS_LANG, ela NÃO é.

    E) SELECT userenv ('lang') from dual;
    Esse comando SELECT oferece o código reduzido que a Oracle usa para o Idioma definido na configuração NLS_LANGUAGE durante a sessão atual. Se NLS_LANGUAGE estiver configurado em Francês, o resultado será "F", se NLS_LANGUAGE estiver configurado em Inglês, o resultado será "GB"
    se NLS_LANGUAGE estiver configurado em Inglês Norte-Americano, o resultado será "US", e assim por diante...

    F) SHOW parameter NLS%
    Retornará o mesmo de NLS_INSTANCE_PARAMETERS

  • Um exemplo de uma configuração NLS_LANG incorreta

    Um banco de dados é criado em um sistema UNIX com o conjunto de caracteres US7ASCII. Um cliente Windows conectado ao banco de dados trabalha com o conjunto de caracteres WE8MSWIN1252 (configurações regionais -> Europa Ocidental /ACP 1252) e o DBA, use o UNIX shell (ROMAN8) para trabalhar no banco de dados. O NLS_LANG está definido como american_america.US7ASCII nos clientes e no servidor.

    Note:
    
    This is an INCORRECT setup to explain character set conversion, don't use it in your environment!

    Um ponto muito importante (como mencionado anteriormente):

    Quando o conjunto de caracteres NLS_LANG do cliente é definido com o mesmo valor que o conjunto de caracteres do banco de dados, a Oracle presume que os dados enviados ou recebidos são da mesma codificação (correta), portanto, nenhuma conversão ou validação pode ocorrer por motivos de desempenho. Os dados são armazenados da forma como são entregues pelo cliente, pouco a pouco.

    From Windows insert an ‘é’ (LATIN SMALL LETTER E WITH ACUTE) into a table NLS_TEST containing one column ‘TEST’ of the type 'char'.

    Desde que você insira e selecione na coluna do Windows o conjunto de caracteres WE8MSWIN1252, tudo funcionará sem problemas. Nenhuma conversão é feita e 8 bits são inseridos e lidos novamente, mesmo que o conjunto de caracteres do banco de dados seja definido como 7 bits. Isso acontece porque um byte tem 8 bits e a Oracle está SEMPRE usando 8 bits, mesmo com um conjunto de caracteres de 7 bits. Em uma configuração correta, o Bit mais significativo não é usado e apenas 7 bits são levados em consideração.

    Por um motivo ou outro, você precisa inserir no servidor UNIX. Quando você aplica SELECT from tables where data is inserted by the Windows clients você recebe ‘Ò’ (O LATINO MAIÚSCULO COM ACENTO AGUDO) em vez de ‘é’.

    Se você inserir ‘é’ no servidor UNIX e aplicar SELECT na linha do cliente Windows, você receberá ‘Å’ (A LATINO MAIÚSCULA COM ANEL EM CIMA) back.

    O ponto principal é que você tem dados INCORRETOS no banco de dados. Você armazena o valor numérico para 'é' do conjunto de caracteres WE8MSWIN1252 no banco de dados, mas informa à Oracle que são dados US7ASCII, então a Oracle NÃO está convertendo nada e apenas armazena o valor numérico (novamente: a Oracle acredita que o cliente está fornecendo códigos US7ASCII porque NLS_LANG está definido como US7ASCII, e o conjunto de caracteres do banco de dados também é US7ASCII -> nenhuma conversão será feita).

    Quando você SELECIONA a mesma coluna novamente no servidor UNIX, a Oracle espera novamente que o valor esteja correto e transmita o valor ao terminal UNIX sem nenhuma conversão.

    Agora, o problema é que, no conjunto de caracteres WE8MSWIN1252, o tem o valor hexadecimal 'E9', além do conjunto de caracteres Roman8, o valor hexadecimal para 'é' é 'C5'. A Oracle passa apenas o valor armazenado no banco de dados ('E9') para o terminal UNIX, e o terminal UNIX acha que esta é a letra ‘?’ porque em seu conjunto de caracteres (Roman8) o valor hexadecimal 'E9' está representando a letra ‘Ò’. Dessa forma, em vez de ‘é’ você verá ‘Ò’ na tela do terminal UNIX.

    O inverso (a inserção no UNIX e o SELECT no cliente Windows) é a mesma história, mas você obtém outros resultados.

    A solução é criar um banco de dados com um conjunto de caracteres que contenha ‘é’

    (WE8MSWIN1252, WE8ISO89859P1, UTF-8 etc.) e configurando o NLS_LANG no cliente para WE8MSWIN1252 e no servidor para WE8ROMAN8. Se você inserir um 'é' nos dois lados, você receberá um 'é' de volta, independentemente de onde você aplicar SELECT. A Oracle sabe que um valor hexadecimal de 'C5 inserido pelo UNIX e um 'E9 de um cliente WE8MSWIN1252 são ambos e insere no banco de dados (o código no banco de dados depende do conjunto de caracteres que você escolheu).

    Você não precisa alternar entre UNIX, Windows ou outros clientes do SO para encontrar esse tipo de problema. O mesmo problema aparece se você adicionar clientes Windows que estão usando outro conjunto de caracteres e tiver um conjunto NLS_LANG incorreto.

  • Como configurar o NLS_LANG Corretamente para UNIX

    Para especificar o comportamento da localidade do software Oracle do cliente, você deve definir seu parâmetro NLS_LANG. Ele define o idioma, o território e também o conjunto de caracteres do seu cliente. Você precisa verificar as configurações do ambiente de localidade para definir seu terceiro campo NLS_LANG (conjunto de caracteres) de acordo com ele. Para fazer isso, use o comando "locale" desta forma:

    $ locale

    Example of output:
    
    LANG=fr_FR 
    LC_CTYPE="fr_FR.iso885915@euro" 
    LC_COLLATE="fr_FR.iso885915@euro" 
    LC_MONETARY="fr_FR.iso885915@euro" 
    LC_NUMERIC="fr_FR.iso885915@euro" 
    LC_TIME="fr_FR.iso885915@euro" 
    LC_MESSAGES="fr_FR.iso885915@euro" 
    LC_ALL=fr_FR.iso885915@euro

    A saída deste comando não é exatamente a mesma em todos os ambientes Unix. Em algumas plataformas, pode ser útil usar a seguinte sintaxe para obter mais detalhes sobre a página de código realmente usada:

    $ locale LC_CTYPE | head

    Example of output     
             in a HP-UX environment   
             :   
    
    ""
      
    
       
    
    
     
     
     
    ""
      
    
       
    
    
     
     
     
    "iso885915"
      
    
       
    
    
     
     
     
    ""
      
    
       
    
    
     
     
     
              Example of output in a Linux environment:   
      
    
       
    
    
     
     
     
    upper;lower;alpha;digit;xdigit;space;print;graph;blank;cntrl;
    punct;alnum;
    combining;combining_level3 
    toupper;tolower;totitle 
    16 
    1 
    ISO-8859-15 
    70 
    84 
    1 
    0

    Nesses casos, o terceiro campo NLS_LANG deve ser definido como WE8ISO8859P15. No Solaris, AIX, TRU64, essa sintaxe não fornece informações complementares interessantes. Para encontrar mais detalhes sobre essas configurações:

    No Solaris, procure em /usr/lib/locale
    No AIX, procure em /usr/lib/nls/README
    No TRU64, procure em /usr/lib/nls
    No HP-UX, procure em /usr/lib/nls/config
    No Linux, procure em /usr/share/locale/locale.alias

    Para definir um valor escolhido para essas configurações "locale", é necessário saber quais valores estão disponíveis. Para saber isso, use a seguinte sintaxe:

    $ locale -a

    Então, quando você escolher um valor, por exemplo, UTF-8 no Linux, poderá configurá-lo da seguinte maneira:

    $ export LC_ALL=UTF-8

    ou

    % setenv LC_ALL UTF-8
    Example of output after the setenv:
    
    $ locale 
    
    LANG=fr_FR 
    LC_CTYPE="UTF-8" 
    LC_NUMERIC="UTF-8" 
    LC_TIME="UTF-8" 
    LC_COLLATE="UTF-8" 
    LC_MONETARY="UTF-8" 
    LC_MESSAGES="UTF-8" 
    LC_PAPER="UTF-8" 
    LC_NAME="UTF-8" 
    LC_ADDRESS="UTF-8" 
    LC_TELEPHONE="UTF-8" 
    LC_MEASUREMENT="UTF-8" 
    LC_IDENTIFICATION="UTF-8" 
    LC_ALL=UTF-8 
    
    $ locale LC_CTYPE | head 
    upper;lower;alpha;digit;xdigit;space;print;
    
    graph;blank;cntrl;punct;alnum;combining;combining_level3 
    toupper;tolower;totitle 
    16 
    6 
    UTF-8 
    70 
    84 
    1 
    0 
    1

    Nesse caso, o terceiro campo (conjunto de caracteres) de NLS_LANG deve ser definido como UTF8.

    % setenv NLS_LANG American_America.UTF8

  • Como configurar o NLS_LANG Corretamente para Páginas de Código do Windows e do DOS

    Nos sistemas Windows, o esquema de codificação (conjunto de caracteres) é especificado por uma página de código. As páginas de código são definidas para oferecer suporte a idiomas ou grupos de idiomas específicos, que compartilham sistemas de escrita comuns. Do ponto de vista da Oracle, os termos página de código e conjunto de caracteres têm o mesmo significado. Observe que em ambientes que não sejam Chinês-Japonês-Coreano, o prompt de comando da GUI e do DOS do Windows não usa a mesma página de código.

    Como resultado, o Windows usa dois conjuntos de caracteres diferentes para os ambientes ANSI (sqlplusw.exe) e OEM (caixa dos - sqlplus.exe).

  • Onde definir o NLS_LANG no Windows

    No Registro:
    nos sistemas Windows, certifique-se de ter definido uma subchave de registro NLS_LANG para cada um dos seus Homes da Oracle:
    Você pode modificar facilmente essa subchave com o Editor de Registro do Windows:
    Iniciar -> Executar...
    Digite "regedit" e clique em "ok"
    Edite a seguinte entrada de registro:

    Para o Oracle versão 7:

    HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE

    Para o Oracle Database versões 8, 8i e 9i:

    HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMEx\

    onde "x" é o número exclusivo que identifica a página inicial da Oracle.

    HOME0 é a primeira instalação

    Para o Oracle Database 10g:

    HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_

    Lá você tem uma entrada com o nome NLS_LANG

    Ao iniciar as ferramentas Oracle, como SQL*Plusw, ele lerá o conteúdo do arquivo oracle.key localizado no mesmo diretório para determinar qual árvore de registro será usada e, portanto, qual subchave NLS_LANG será usada.

    Observação:

    Algumas pessoas ficam confusas ao encontrar um conjunto NLS_LANG definido como "NA" em HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE quando nenhuma versão 7 foi instalada. Isso é usado para compatibilidade com versões anteriores e pode ser ignorado.

    Como uma Variável de Ambiente do Sistema ou do Usuário, nas propriedades do Sistema:

    Embora o Registro seja o repositório principal de configurações no Windows, não é o único local em que os parâmetros podem ser definidos. Mesmo se não for recomendado, você pode definir o NLS_LANG como uma Variável de Ambiente do Sistema ou do Usuário nas propriedades do Sistema.

    Essa configuração será usada para TODAS as páginas iniciais da Oracle.

    Para verificar e modificá-las:

    Clique com o botão direito do mouse no 'ícone Meu Computador -> 'Propriedades'

    Selecione a 'Guia Avançado -> Clique em 'Variáveis de Ambiente'

    A 'lista Variáveis de Usuário contém as configurações do usuário específico do SO conectado atualmente e as 'variáveis de todo o sistema para todos os usuários.

    Como essas variáveis de ambiente têm precedência sobre os parâmetros já definidos no seu Registro, você não deve definir os parâmetros Oracle nesse local, a menos que tenha um bom motivo.

    Como uma variável de Ambiente definida no prompt de comando:

    Antes de usar uma ferramenta de linha de comando Oracle, você precisa DEFINIR MANUALMENTE o parâmetro NLS_LANG. Em um prompt de comando do MS-DOS, use o comando set, por exemplo:

    C:\> set NLS_LANG=american_america.WE8PC850

  • Determine sua página de código ANSI do Windows

    Agora que você sabe como o NLS_LANG está definido, pode verificar se está de acordo com a página de código ANSI atual. O ACP (Página de Código ANSI) é definido pela configuração "localidade padrão" do Windows, portanto, se você possui um cliente Windows 2000 no Reino Unido e deseja inserir Cirílico (Russo), precisa alterar o ACP (alterando a "localidade padrão") para poder inserir Russo.

    Você' encontrará seu valor no registro:

    Iniciar -> Executar...

    Digite "regedit" e clique em "ok"

    Procure a seguinte entrada de registro:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\NLS\CodePage\

    Lá você tem (até o fim) uma entrada com o nome de ACP. O valor de ACP é sua página de código da GUI atual, para o mapeamento para o nome Oracle. Como existem muitas entradas de registro com nomes muito semelhantes, verifique se você está procurando o lugar certo no registro.

    Além disso, a seguinte URL fornece uma lista das páginas de código padrão para todas as versões do Windows:

    http://www.microsoft.com/globaldev/reference/ (na guia REFERENCE, à esquerda da página)

    OEM = a página de código da linha de comando, ANSI = a página de código da GUI

    Observe que Honk Kong HKSCS está listado aqui:http://www.microsoft.com/hk/hkscs/

    Localize o conjunto de caracteres do cliente Oracle correspondente:

    Encontre o conjunto de caracteres do cliente Oracle na tabela abaixo com base no ACP encontrado acima. Observe que há apenas um valor CORRETO para um determinado ACP.

    Página de Código ANSI (ACP) Conjunto de caracteres do Oracle Client (terceira parte de NLS_LANG)

    1250

    EE8MSWIN1250

    1251

    CL8MSWIN1251

    1252

    WE8MSWIN1252

    1253

    EL8MSWIN1253

    1254

    TR8MSWIN1254

    1255

    IW8MSWIN1255

    1256

    AR8MSWIN1256

    1257

    BLT8MSWIN1257

    1258

    VN8MSWIN1258

    874

    TH8TISASCII

    932

    JA16SJIS

    936

    ZHS16GBK

    949

    KO16MSWIN949

    950

    ZHT16MSWIN950 - exceto Hong Kong (veja abaixo)

    Este é o conjunto de caracteres usado pela SQL*Plus da GUI (sqlplusW.exe/plus80W.exe/plus33W.exe) que você inicia no menu Iniciar do Windows. Observe a diferença entre o SQL*Plus da GUI e o SQL*Plus do "modo DOS".

    Você pode usar o UTF8 como conjunto de caracteres do cliente Oracle (=NLS_LANG) no Windows NT, 2000 e XP, mas estará limitado a usar apenas programas clientes que suportem explicitamente essa configuração. Isso ocorre porque a interface do usuário do Win32 não é UTF8, portanto, o programa cliente precisa executar conversões explícitas entre o UTF8 (usado no lado Oracle) e o UTF16 (usado no lado Win32).

    Defina-o no seu Registro:

    Use o Editor do Registro do Windows para configurar o NLS_LANG na sua Página Inicial da Oracle com o valor que você acabou de encontrar acima.

  • O NLS_LANG correto para Operações de Linha de Comando do Windows

    O modo MS-DOS usa, com algumas exceções, como CJK, (Japonês, Coreano, Chinês Simplificado e Chinês Tradicional) uma página de código diferente (chamada de página de código OEM) da GUI do Windows (página de código ANSI). Isso significa que, antes de usar uma ferramenta da linha de comando da Oracle, como SQL*Plus (sqlplus.exe/plus80.exe/plus33.exe) en svrmgrl em um prompt de comando, você precisará DEFINIR MANUALMENTE o parâmetro NLS_LANG como uma variável de ambiente com o comando DOS configurado ANTES de usar a ferramenta.

    Para Japonês, Coreano, Chinês Simplificado e Chinês Tradicional, a página de código OEM do MS-DOS (CJK) é idêntica à página de código ANSI, o que significa que, nesse caso específico, não há necessidade de definir o parâmetro NLS_LANG no modo MS-DOS.

    Em todos os outros casos, é necessário configurá-lo para substituir a chave de registro NLS_LANG que já corresponde à página de código ANSI. O novo NLS_LANG no "MS-DOS dedicado" precisa corresponder à página de código OEM do MS-DOS que pode ser recuperada digitando chcp em um Prompt de Comando:

    C:\> chcp

    Página de código ativa: 437

    C:\> set NLS_LANG=american_america.US8PC437

    Se o parâmetro NLS_LANG para a sessão no modo MS-DOS não estiver definido adequadamente, as mensagens de erro e os dados poderão ser corrompidos devido à conversão incorreta do conjunto de caracteres.

    Use a lista a seguir para encontrar o conjunto de caracteres da Oracle que se ajusta à sua página de código do MS-DOS em uso no seu sistema de localidade:

    Página de código do MS-DOS Conjunto de caracteres do Oracle Client (terceira parte de NLS_LANG)

    437

    US8PC437

    737

    EL8PC737

    850

    WE8PC850

    852

    EE8PC852

    857

    TR8PC857

    858

    WE8PC858

    861

    IS8PC861

    862

    IW8PC1507

    865

    N8PC865

    866

    RU8PC866

  • Lista de configurações comuns de NLS_LANG usadas no Registro do Windows:

    Observação: esta é a configuração correta para a versão GUI SQL*Plus, (sqlplusW.exe/ plus80W.exe / plus33W.exe )

    Se você estiver testando com caracteres "especiais", USE a GUI e não use o sqlplus.exe da "caixa DOS"!

    Operating System Locale Valor NLS_LANG

    Árabe (EAU)

    ARABIC_UNITED ARAB EMIRATES.AR8MSWIN1256

    Búlgaro

    BULGARIAN_BULGARIA.CL8MSWIN1251

    Catalão

    CATALAN_CATALONIA.WE8MSWIN1252

    Chinês (RPC)

    CHINESE_CHINA.ZHS16GBK SIMPLIFICADO

    Chinês (Taiwan)

    CHINESE_TAIWAN.ZHT16MSWIN950 TRADICIONAL

    Chinês (Hong Kong HKCS)

    CHINESE_HONG KONG.ZHT16HKSCS TRADICIONAL

    Chinês (Hong Kong HKCS2001)

    CHINESE_HONG KONG.ZHT16HKSCS2001 TRADICIONAL (novo em 10gR1)

    Croata

    CROATIAN_CROATIA.EE8MSWIN1250

    Tcheco

    CZECH_CZECH REPUBLIC.EE8MSWIN1250

    Dinamarquês

    DANISH_DENMARK.WE8MSWIN1252

    Holandês (Holanda)

    DUTCH_THE NETHERLANDS.WE8MSWIN1252

    Holandês (Bélgica)

    DUTCH_BELGIUM.WE8MSWIN1252

    Inglês (Reino Unido)

    ENGLISH_UNITED KINGDOM.WE8MSWIN1252

    Inglês (Estados Unidos)

    AMERICAN_AMERICA.WE8MSWIN1252

    Estoniano

    ESTONIAN_ESTONIA.BLT8MSWIN1257

    Finlandês

    FINNISH_FINLAND.WE8MSWIN1252

    Francês (Canadá)

    CANADIAN FRENCH_CANADA.WE8MSWIN1252

    Francês (França)

    FRENCH_FRANCE.WE8MSWIN1252

    Alemão (Alemanha)

    GERMAN_GERMANY.WE8MSWIN1252

    Grego

    GREEK_GREECE.EL8MSWIN1253

    Hebraico

    HEBREW_ISRAEL.IW8MSWIN1255

    Húngaro

    HUNGARIAN_HUNGARY.EE8MSWIN1250

    Islandês

    ICELANDIC_ICELAND.WE8MSWIN1252

    Indonésio

    INDONESIAN_INDONESIA.WE8MSWIN1252

    Italiano (Itália)

    ITALIAN_ITALY.WE8MSWIN1252

    Japonês

    JAPANESE_JAPAN.JA16SJIS

    Coreano

    KOREAN_KOREA.KO16MSWIN949

    Letão

    LATVIAN_LATVIA.BLT8MSWIN1257

    Lituano

    LITHUANIAN_LITHUANIA.BLT8MSWIN1257

    Norueguês

    NORWEGIAN_NORWAY.WE8MSWIN1252

    Polonês

    POLISH_POLAND.EE8MSWIN1250

    Português (Brasil)

    BRAZILIAN PORTUGUESE_BRAZIL.WE8MSWIN1252

    Português (Portugal)

    PORTUGUESE_PORTUGAL.WE8MSWIN1252

    Romeno

    ROMANIAN_ROMANIA.EE8MSWIN1250

    Russo

    RUSSIAN_CIS.CL8MSWIN1251

    Eslovaco

    SLOVAK_SLOVAKIA.EE8MSWIN1250

    Espanhol (Espanha)

    SPANISH_SPAIN.WE8MSWIN1252

    Sueco

    SWEDISH_SWEDEN.WE8MSWIN1252

    Tailandês

    THAI_THAILAND.TH8TISASCII

    Espanhol (México)

    MEXICAN SPANISH_MEXICO.WE8MSWIN1252

    Espanhol (Venezuela)

    LATIN AMERICAN SPANISH_VENEZUELA.WE8MSWIN1252

    Turco

    TURKISH_TURKEY.TR8MSWIN1254

    Ucraniano

    UKRAINIAN_UKRAINE.CL8MSWIN1251

    Vietnamita

    VIETNAMESE_VIETNAM.VN8MSWIN1258

  • Lista de configurações NLS_LANG comuns usadas no Prompt de Comando (caixa DOS)

    Observação: esta é a configuração correta para configurar a versão DOS BOX SQL*Plus, (sqlplus.exe/ plus80.exe / plus33.exe )

    Operating System Locale Conjunto de caracteres do Oracle Client (terceira parte de NLS_LANG)

    Árabe

    AR8ASMO8X

    Catalão

    WE8PC850

    Chinês (RPC)

    ZHS16GBK

    Chinês (Taiwan)

    ZHT16MSWIN950

    Tcheco

    EE8PC852

    Dinamarquês

    WE8PC850

    Holandês

    WE8PC850

    Inglês (Reino Unido)

    WE8PC850

    Inglês (Estados Unidos)

    US8PC437

    Finlandês

    WE8PC850

    Francês

    WE8PC850

    Alemão

    WE8PC850

    Grego

    EL8PC737

    Hebraico

    IW8PC1507

    Húngaro

    EE8PC852

    Italiano

    WE8PC850

    Japonês

    JA16SJIS

    Coreano

    KO16MSWIN949

    Norueguês

    WE8PC850

    Polonês

    EE8PC852

    Português

    WE8PC850

    Romeno

    EE8PC852

    Russo

    RU8PC866

    Eslovaco

    EE8PC852

    Esloveno

    EE8PC852

    Espanhol

    WE8PC850

    Sueco

    WE8PC850

    Turco

    TR8PC857

  • Outras Perguntas Frequentes sobre NLS_LANG

    O que o componente de IDIOMA do parâmetro NLS_LANG controla?

    Cada componente de idioma do parâmetro NLS_LANG controla a operação de um subconjunto de recursos de suporte à globalização: Ele especifica convenções como o idioma usado para mensagens da Oracle, classificação, nomes de dias e nomes de meses. Cada idioma suportado possui um nome exclusivo; por exemplo, AMERICANO, FRANCÊS ou ALEMÃO. O argumento idioma especifica valores padrão para o território e os argumentos do conjunto de caracteres. Se o idioma não for especificado, o valor padrão será AMERICANO.

    O que o componente de TERRITÓRIO do parâmetro NLS_LANG controla?

    Cada componente de território do parâmetro NLS_LANG controla a operação de um subconjunto de recursos de suporte à globalização: Ele especifica convenções como a data padrão, os formatos monetário e numérico. Cada território suportado possui um nome exclusivo, como, por exemplo, AMÉRICA, FRANÇA ou CANADÁ. Se o território não for especificado, o valor será derivado do valor do idioma.

  • Como ver o que está realmente armazenado no banco de dados?

    Para encontrar o valor numérico real de um caractere armazenado no banco de dados, use o comando dump:

    A sintaxe da chamada de função é:

    DUMP( <value> [, <format> [, <offset> [, <length> ] ] ] )

    onde:

    value - é o valor a ser exibido

    format - é um número que descreve o formato no qual os bytes do valor devem ser exibidos: 8 - significa octal, 10 - significa decimal, 16 - significa hexadecimal; outros valores entre 0 e 16 casas decimais médias; valores maiores que 16 são um pouco confusos e significam: imprimir bytes como caracteres ASCII se corresponderem a códigos ASCII imprimíveis, imprimi-los como "^x" se corresponderem aos códigos de controle ASCII e imprimi-los em hexadecimais; adicionar 1000 ao número do formato adicionará informações do conjunto de caracteres para os valores do tipo de dados de caracteres para o deslocamento do valor de retorno - é o deslocamento do primeiro byte do valor a ser exibido; os valores negativos significam a contagem a partir do tamanho final - é o número de bytes a ser exibido. Então, por exemplo,

    SQL> SELECT DUMP(col,1016)FROM table;

    Typ=1 Len=39 CharacterSet=UTF8: 227,131,143,227,131,170

    retorna o valor de uma coluna composta por 3 caracteres japoneses na codificação UTF8. Por exemplo, o primeiro caractere é 227(*255)+131. Você provavelmente precisará convertê-lo em UCS2 para verificar o valor do ponto de código com a página de código Padrão Unicode.

    Onde é Feita a Conversão de Caracteres?

    Normalmente, a conversão é feita no lado do cliente por razões de desempenho. Isso é verdade a partir da Versão 8.0.4 em diante. Se o banco de dados estiver usando um conjunto de caracteres não conhecido pelo cliente, a conversão será feita no lado do servidor. Isso é verdade a partir da Versão 8.1.6 em diante.

    O Windows SQL*Plus não está mostrando todos os meus caracteres estendidos?

    Você enxergará quadrados pretos em vez dos caracteres. Isso significa que você nõ possui a fonte correta para o seu código. Uma fonte é uma coleção de glifos (de "hieróglifos") que compartilham aparência comum (tipo de letra, tamanho de caractere). Uma fonte é usada pelo sistema operacional para converter um valor numérico em uma representação gráfica na tela. Uma fonte não contém necessariamente uma representação gráfica para todos os valores numéricos definidos na página de códigos que você está usando. É por isso que, às vezes, você obtém quadrados pretos na tela se você alterar as fontes e a nova fonte não tiver representação para um determinado símbolo.

    O utilitário "Character Set Map" do Windows pode ser usado para ver quais glifos fazem parte de uma determinada fonte.

    No Windows 2000 e XP:

    Iniciar -> Executar...

    Digite "charmap" e clique em "ok".

    Recebo um ponto de interrogação ou ponto de interrogação invertido ao selecionar novamente os caracteres recém-inseridos?

    Quando os caracteres são convertidos entre o cliente e o conjunto de caracteres do banco de dados, ou vice-versa, o caractere deve existir em ambos. Se ele não existir no conjunto de caracteres que está sendo convertido para (o destino), um caractere de substituição será usado. Alguns conjuntos de caracteres possuem caracteres de substituição específicos definidos ao converter de outros conjuntos de caracteres específicos, mas onde isso não é feito, um caractere de substituição padrão, como?, é usado. A conversão de um caractere de substituição para o original não é possível.

    iSQL*Plus é o único cliente habilitado para UTF8/Unicode suportado?

    No sistema operacional Windows, sim, no sistema operacional Unix, não. Todos os utilitários de banco de dados, incluindo Import, Export, SQL*Loader, SQL*Plus, podem atuar como um cliente UTF-8 se o código do idioma do SO for UTF-8 (por exemplo, en_US.UTF-8 no Linux) e o conjunto de caracteres NLS_LANG for definido como UTF8 ou AL32UTF8.

    Como verificar os pontos de código gerenciados por um Sistema Operacional UNIX?

    Para saber qual ponto de código é gerado para um caractere em um ambiente Unix, você pode usar o comando "od":

    $ echo "" | od -xc

    Você também pode verificar o caractere correspondente a um ponto de código usando o comando "echo" desta forma:

    para Solaris, AIX, HP-UX, TRU64:

    $echo '\0351'

    para Linux:

    $echo -e '\0351'

    Você pode usar o Locale Builder ou uma página de código impressa (consulte os links abaixo) para verificar se sua página de código nativa e a configuração NLS_LANG correspondem corretamente. Se houver alguma ambiguidade, use o comando acima para obter os valores para mais de um caractere. Para página de código impressa:

    http://www.unicode.org

    http://www.iso.org

    http://czyborra.com/charsets/iso8859.html

  • E as ferramentas de linha de comando, como SQL*Loader, Import, Export, utilitários?

    Normalmente, o NLS_LANG precisa corresponder à página de código OEM do MS-DOS que pode ser recuperada digitando chcp em um prompt de comando:

    C:\> chcp

    Página de código ativa: 437

    C:\> set NLS_LANG=american_america.US8PC437

    Para ferramentas como o SQL*Loader, você pode alterar temporariamente o NLS_LANG para o conjunto de caracteres do ARQUIVO que está carregando. Uma alternativa para alterar NLS_LANG é especificar o conjunto de caracteres dos dados no arquivo de dados usando a palavra-chave do conjunto de caracteres no arquivo .ctl. Nesse caso, o SQL*Loader interpretará os dados no arquivo de dados como esse conjunto de caracteres, independentemente da configuração do conjunto de caracteres do cliente NLS_LANG. Aqui está um exemplo de arquivo .ctl para utf16. Este exemplo é enviado na área de demonstração:

    -- Copyright (c) 2001 by Oracle Corporation
    --   NAME
    --     ulcase11.ctl - Load Data in the Unicode Character Set UTF-16
    --   DESCRIPTION
    --     Loads data in the Unicode character set UTF-16. The data is in little
    --     Endean byte order. This means that depending on whether SQL*Loader is
    --     running on a little Endean or a big Endean system, it will have to
    --     byte swap the UTF-16 character data as necessary. This load uses
    --     character length semantics, the default for the character set UTF-16.
    -- 
    --     This case study is modeled after case study 3 (ulcase3), which loads
    --     variable length delimited (terminated and enclosed) data.
    -- 
    --   RETURNS
    -- 
    --   NOTES
    --     None
    --   MODIFIED   (MM/DD/YY)
    --    rpfau     02/06/01  - Merged rpfau_sqlldr_add_case_study_11
    --    rpfau     01/30/01 -  Creation
    --
    
    LOAD DATA
    CHARACTERSET utf16
    BYTEORDER little
    INFILE ulcase11.dat
    REPLACE
    
    INTO TABLE EMP
    FIELDS TERMINATED BY X'002c' OPTIONALLY ENCLOSED BY X'0022'
    (empno integer external (5), ename, job, mgr,
     hiredate DATE(20) "DD-Month-YYYY",
     sal, comm,
     deptno   CHAR(5) TERMINATED BY ":",
     projno,
     loadseq  SEQUENCE(MAX,1) )

    No Oracle9i, o utilitário Export sempre exporta dados do usuário, incluindo dados Unicode, no conjunto de caracteres do banco de dados. O utilitário Import converte automaticamente os dados no conjunto de caracteres do banco de dados de destino.

    No Oracle8i, o utilitário Export exporta dados do usuário, convertendo-os do conjunto de caracteres do banco de dados para o conjunto de caracteres do NLS_LANG da sessão Export. O utilitário Import primeiro converte os dados no conjunto de caracteres do NLS_LANG da sessão Import e depois os converte no conjunto de caracteres do banco de dados de destino. Deve-se tomar cuidado para que o conjunto de caracteres de NLS_LANG para as sessões Export e Import contenha todos os caracteres a serem migrados. Esse conjunto de caracteres geralmente é escolhido para ser o banco de dados de origem ou de destino e geralmente é o mesmo para as sessões Export (Exportar) e Import (Importar). Essa opção é recomendada especialmente com conjuntos de caracteres multibyte, que apresentam algumas restrições nos arquivos de exportação. As conversões Oracle8i de e para o conjunto de caracteres NLS_LANG acontecem no Oracle9i para instruções DDL contidas no arquivo de exportação.

  • E os links do banco de dados?

    O NLS_LANG no servidor (ou cliente) não influencia a conversão do conjunto de caracteres por meio de um link de banco de dados. A Oracle fará a conversão do conjunto de caracteres do banco de dados de origem para o conjunto de caracteres do banco de dados de destino (ou inverso).

  • E as Várias Páginas Iniciais no Windows?

    Não há nada de especial no NLS_LANG e nas várias páginas iniciais no Windows. O parâmetro levado em consideração é o especificado na chave de registro ORACLE_HOME usada pelo executável. Se o NLS_LANG estiver definido no ambiente, ele terá precedência sobre o valor no registro e será usado para TODAS AS Oracle_Homes no servidor/cliente.

    O NLS_LANG pode ser encontrado nessas chaves de registro:

    HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE

    ou

    HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMEx
  • Existe um Oracle Unicode Client no Windows?

    No Windows, existem dois tipos de ferramentas/aplicativos:

    1. 1) Aplicativos totalmente habilitados para Unicode que aceitam pontos de código Unicode e que podem renderizá-los. É o aplicativo que precisa lidar com o Unicode. O Windows oferece o Unicode API, mas a GUI do sistema, por si só, NÃO É nativamente Unicode.
      Um aplicativo totalmente Unicode pode mostrar apenas um glifo para um determinado ponto de código Unicode. Portanto, NÃO há confusão possível aqui, este aplicativo precisará usar uma fonte Unicode completa. Caso você tenha uma aplicação integralmente em Unicode, será necessário configurar o NLS_LANG para UTF8.
      Observe que atualmente não há muitos aplicativos como esse e, se não for declarado explicitamente pelo fornecedor, provavelmente será um aplicativo ANSI. Não defina o NLS_LANG em UTF8 se não tiver certeza!

      O único cliente compatível com Unicode incluído no Oracle database é o iSQL*Plus.

    2. 2) O aplicativo ANSI padrão (como sqlplusw.exe) não pode usar pontos de código Unicode. Portanto, o ponto de código Unicode armazenado no banco de dados precisa ser CONVERTIDO em um ponto de código ANSI com base na configuração correta do NLS_LANG. Isso permite que a Oracle mapeie o ponto de código Unicode para o conjunto de caracteres do cliente. Se o ponto de código Unicode não tiver um mapeamento para o conjunto de caracteres do cliente, um caractere de substituição será usado.
  • O que é um Conjunto de caracteres ou uma Página de Códigos?

    Um conjunto de caracteres é apenas um acordo sobre qual valor numérico um símbolo possui. Um computador não sabe o que é 'A ou 'B' ele conhece apenas o valor numérico (binário) desse símbolo, definido no conjunto de caracteres usado pelo sistema operacional (SO) ou no hardware (firmware) dos terminais. Um computador pode apenas manipular números, e é por isso que há uma necessidade de conjuntos de caracteres. Um exemplo é 'ASCII', um conjunto de caracteres antigo de 7 bits, 'ROMAN8 um conjunto de caracteres de 8 bits no UNIX ou 'UTF8 um conjunto de caracteres multibyte.

    Uma página de código é o nome dos esquemas de codificação do Windows/DOS. Para Oracle NLS, você pode considerá-lo o mesmo que um conjunto de caracteres. Você também precisa distinguir entre uma FONTE e uma página de códigos/conjunto de caracteres. Uma fonte é usada pelo SO para converter valores numéricos e exibí-los na tela em forma de gráficos. A Fonte Wingdings no Windows é o melhor exemplo de fonte em que um 'A' NÃO é mostrado como um 'A' na tela, mas para o sistema operacional, o valor numérico representa um 'A'. Você não o VÊ como um 'A', mas para o Windows, é um 'A' e será salvo (ou usado) como um 'A'.

    Para entender melhor a explicação acima, basta abrir o MS Word, escolher a Fonte Wingdings, digitar seu nome (você verá símbolos) e salvá-lo como html. Se você abrir o arquivo html no Bloco de Notas, verá que na seção <style>, as fontes são declaradas e minúsculas na seção <body>, você encontrará seu nome em texto simples, mas com o atributo style='font-family: Wingdings'. Se você o abrir no Internet Explorer ou Netscape, verá novamente os símbolos Wingdings. É a apresentação que muda, não os dados em si.

    Também é possível que você não veja com uma fonte específica, todos os símbolos definidos na página de código que você está usando, apenas porque o criador da FONTE não incluiu uma representação gráfica para todos os símbolos nessa fonte. É por isso que, às vezes, você obtém quadrados pretos na tela se alterar as fontes. No Windows, você pode usar a ferramenta 'Mapa de Caracteres' para ver todos os símbolos definidos em uma fonte.

  • Por que Existem Conjuntos de Caracteres Diferentes?

    Duas razões principais:

    Ao longo do tempo, os fornecedores definiram 'conjuntos de caracteres diferentes para seu hardware e software, principalmente porque não existiam padrões oficiais.

    Novos conjuntos de caracteres foram definidos para suportar novos idiomas. Com um conjunto de caracteres de 8 bits, você é limitado no número de símbolos que pode suportar, para que haja conjuntos de caracteres diferentes para diferentes idiomas escritos.

  • Qual é a diferença entre os conjuntos de caracteres de 7 bits, 8 bits e Unicode?

    Um conjunto de caracteres de 7 bits conhece apenas 128 símbolos (2^7)

    Um conjunto de caracteres de 8 bits conhece 256 símbolos (2^8)

    Unicode (UTF-8) é um conjunto de caracteres multibyte. Unicode tem a capacidade de definir mais de um milhão de caracteres. Para obter mais informações sobre Unicode, consulte o artigo técnico Suporte ao Banco de Dados Unicode da Oracle (PDF)

  • Como escolher o conjunto de caracteres de banco de dados correto?

    Uma consideração básica para escolher um conjunto de caracteres é garantir que ele possa lidar com qualquer idioma que precise ser suportado imediatamente e em futuro indeterminado. Outra consideração negligenciada é pensar em quais aplicativos e tecnologias você pode querer utilizar ou interagir com o banco de dados. Use o construtor de código do idioma (do Oracle Database 9i em diante) para visualizar quais caracteres são definidos para um conjunto de caracteres Oracle específico.

    A escolha de Unicode como o conjunto de caracteres do banco de dados garante uma base sólida para tudo o que estiver embutido e sobre o banco de dados. A Oracle recomenda usar Unicode para todas as novas implementações de sistema. A migração de sistemas legados para Unicode também é recomendada. A implementação de seus sistemas hoje no Unicode oferece muitas vantagens em usabilidade, compatibilidade e extensibilidade. O suporte abrangente da Oracle permite implementar sistemas de alto desempenho com mais rapidez e facilidade, aproveitando o verdadeiro poder do Unicode. Mesmo que não seja necessário oferecer suporte a dados multilíngues hoje ou ter algum requisito para o Unicode, ainda é provável que seja a melhor escolha para um novo sistema a longo prazo, economizando tempo e dinheiro e oferecendo vantagens competitivas.