Funcionamento do Global Language Support (LOCALE)

Versão para impressãoEnviar para amigoVersão PDF

GLS = Global Language Support
Collation = Conjunto, compilaçao
Locale = Local, localizaçao
Code Set/Page = Código de pagina (pt_BR.819)

  1. Definindo a nomenclatura
    1. Locale Categories
  2. Referências
  3. Caracteristicas
  4. Configurando o ambiente
    1. Efeitos do locale na prática
    2. Configuração do locale na aplicação cliente
  5. Artigo copiado

Definindo a nomenclatura


  • Code Set/Page: Codigo da pagina em si, onde define os bits de cada caracter, pode ser single-bytes ou multibytes caracter. Um Code Set multibyte é utilizado em liguas como Japones e Chines onde é necessário 2 a 4 bytes para representar uma unica letra.
    Ela é composta pelo mapa de caracteres mais a ordens logicas existentes para a lingua.
  • Code Set Conversion: Quando dois code-set são compatíveis e é possível converter os caracteres de um para o outro , existe um arquivo para fazer o "DE/PARA" destes caracteres. Estes arquivos são os *.cvo .
  • Code Order: Utilizaçao na ordem da tabela code set, onde no padrão ASCII por exemplo as letras maiusculas (A-Z) vem primeiro que as minusculas (a-z).
  • Collation: Processo de ordenar caracteres conforme uma ordem lógica (Collation Order/Localized Order).
  • Collation Order: Ordem lógica utilizada pelo banco de dados para ordenar "sorts" e indices, onde é baseado no "Code Order" ou "Localized Order"
  • Localized Order: Ordenação lógica dos caracteres , conforme a lingua/cultura definido, ou seja, a = A = á = â .
    Porém tem efeito apenas em campos NCHAR E NVARCHAR .
    Atenção, esta comparação apenas para a ordenação dos dados e não para o filtro. Por exemplo, se pesquisado 'MATCH "teste"' em uma coluna NCHAR/NVARCHAR ela terá o mesmo comportamento que um campo CHAR onde *não* irá trazer dados como "Teste".

Locale Categories


Internamente cada code page é definido em categorias. Cada uma define como tratar cada tipo de dados.
    CTYPE     = Define como classificar caracteres e conversao de caixas
                alta/baixa
    COLLATION = Define como tratar comparaçoes de strings
    NUMERIC   = Define como tratar valores numericos que nao sejam
                monetários.
    MONETARY  = Define como tratar valores monetários
    TIME      = Define como formatar data e hora
    MESSAGES  = "Controls the definitions of affirmative and
                 negative responses to messages."

Referências


Nada melhor que o manual oficial

Caracteristicas


  • Variáveis básicas para definição de locale: CLIENT_LOCALE e DB_LOCALE
  • Para mais informaçoes ler o arquivo $INFORMIXDIR/gls/cm*/registry
  • Para identificar os code set para a lingua/pais , ver quais arquivos estão disponiveis no diretório $INFORMIXDIR/gls/lc*
  • Todos os arquivos do GLS encontra-se no diretório $INFORMIXDIR/gls
    • Localized Order : *.lc , *.lco
    • Code Set : *.cm , *.cmo (Character Mapping , charmap)
    • Code Set Conversion : *.cv , *.cvo Obs.: Os nomes dos arquivos são o código do locale em hexadecimal No manual até diz que é possivel utiliza-los em hexadecimal Exemplo.: DB_LOCALE= en_us.0333 = en_us.819 Porém não funcionou na versão do CSDK 3.50 UC1.
  • Dica: apesar dos arquivos GLS serem versões compiladas são arquivos ASCII e legiveis. Vale apena dar uma olhada.
  • Para definir uma lingua para os dados no banco de dados é necessário cria-lo com a lingua já configurada (DB_LOCALE).
    Por padrao, quando nao especificado o DB_LOCALE é utilizado: en_us.8859-1
    Porém, se no momento da inicialização da instancia (oninit) estiver definido algum valor para o DB_LOCALE, este será o valor padrão.
  • Uma vez que um banco foi criado com "X" lingua, nao é possível mais altera-la. Se for necessário alterar deverá exportar os dados para formato TXT e importa-los em um novo banco .
  • As informaçoes de LOCALE do banco sao gravadas no sysmaster:sysdbslocale ou nas tabelas " GL_CTYPE" e " GL_COLLATE", respectivamente tabid 91 e 90
  • Para utilizar o mesmo formato de lingua no cliente tem que utilizar a variavel CLIENT_LOCALE.
    O clinete pode utilizar um Code-Set diferente do banco porém é necessário existir um arquivo de Code-Set Conversion. Caso não exista irá retornar erro e poderá correr o risco de gravar caracteres inválidos. Para verificar se existe a conversão, procure no diretório $INFORMIXDIR/gls/cv* pelos seus valores em hexadecimais.
    Por exemplo, lá existe o arquivo 033303f9.cvo , isso é igual:
    0333 + 03f9 que coresponde a 819 e 1017 em decimal. Este arquivo é o código da conversão entre eles.
    Dica: É possivel listar as conversões disponiveis com o comando "glfiles -cv" ou com uma pequena shell, por exemplo para o code set 819/8859-1 com o comando abaixo , executado no diretório $INFORMIXDIR/gls/cv* :
     $ head 0333*.cvo | egrep -i "==|target|source"
    

  • Quando conectado no banco e o LOCALE do cliente nao bate com o LOCALE do banco é setado no SQLCA.SQLWARN7 = "W" (8 caracter)
  • Variaveis utilizadas: DB_LOCALE, SERVER_LOCALE, CLIENT_LOCALE, DBNLS, DBLANG, GL_DATE, GL_DATETIME, DBDATE, DBTIME, DBCENTURY
    Para o aplicativos clientes que executam em ambiente Unix/Linux é importante definir também as variáveis LANG e LC_ALL
  • Para clientes que conectam via windows através do ODBC, as variáveis CLIENT_LOCALE e DB_LOCALE devem ser definidas na configuração do ODBC. Conforme a documentação, as definições no setnet32 e variáveis de ambiente são ignoradas.
  • Existe uma limitação (bug) onde, se for ordenado mais de um campo NCHAR/NVARCHAR e este campo possuir alguma acentuação nos dados, a ordenação dos demais campos são ignoradas.
    Em outras palavras, existe uma limitação de ordenação por apenas um campo (testada na versão 11.50 xC5).
    Como solução temporária, basta concatenar os campos a serem ordenados em um unico , realizadno um cast para NCHAR/NVARCHAR.

Configurando o ambiente


  • Para definir a lingua é preciso especificar o país e o Code Set.
      Sintaxe  : DB_LOCALE language_territory . code_set @modifier
      Exemplo  : export DB_LOCALE=pt_BR.819 
                 export DB_LOCALE=pt_BR.8859-1
                 export DB_LOCALE=pt_BR.1252
                 export DB_LOCALE=pt_BR.CP1252
    

  • O Code-Set pode ser especificado em seu codigo decimal ,no seu nome textual ou em hexadecimal:
     pt_BR.819  = pt_BR.8859-1  = pt_BR.0333
     pt_BR.1252 = pt_BR.CP1252  = pt_BR.04e4
     pt_BR.850  = pt_BR.Latin-1 = pt_BR.0352
     

  • Apesar de nao existir conflito, tomar cuidado com compatibilidade do LOCALE especificado entre ambientes Windows/IBM. (ler registry)
  • BUG: Na versão 3.50 do CSDK o diretório com o LOCALE do pt_BR é instalado com nome errado: pt_pr . É necessário renomear o diretório manualmente

Efeitos do locale na prática


Na transação SQL, pode mudar a ordem (localized order) dinamicamente, utilizando o comando SET COLLATION.
Resumo de como a ordem é aplicada:
     Column Data Types      Collating Order
     -------------------    --------------
     CHAR, VARCHAR, TEXT    Code-set order
     LVARCHAR (IDS only)    Code-set order
     NCHAR, NVARCHAR        Localized order

Exceção: Quando utilizado o operador MATCHES e na expresao é utilizado o parametro "[ ]" , sempre é utilizado o localized order, mesmo para os campos CHAR,VARCHAR e LVARCHAR. Porém se o parametro "[ ]" nao for especificado é seguido conforme a tabela descrita anteriormente.

Exemplo

  Ambiente: DB_LOCALE, CLIENTE_LOCALE = pt_BR.8859-1
  tabela: create table teste ( c1 CHAR(15) , c2 NCHAR(15)) ;
  SELECT 1 :select * from teste order by 1
  SELECT 2 :select * from teste order by 2
      Resp : ----- ORDER BY 1 -------        ----- ORDER BY 2 ------
             c1              c2              c1              c2
             "teste"         "teste"         -3451           -3451
             "çeste"         "çeste"         "çeste"         "çeste"
             (123)           (123)           "teste"         "teste"
             -3451           -3451           (123)           (123)
             1234            1234            1234            1234
             9432            9432            9432            9432
             Aubit           Aubit           a140            a140
             CÉSAR           CÉSAR           Ántonio         Ántonio
             César           César           aubit           aubit
             OOOO            OOOO            Aubit           Aubit
             a140            a140            ax34            ax34
             aubit           aubit           cesar           cesar
             ax34            ax34            césar           césar
             cesar           cesar           César           César
             césar           césar           CÉSAR           CÉSAR
             dado            dado            çesar           çesar
             oooo            oooo            Çesar           Çesar
             Ántonio         Ántonio         dado            dado
             Çesar           Çesar           oooo            oooo
             Óooo            Óooo            OOOO            OOOO
             ÓÓÓÓ            ÓÓÓÓ            óooo            óooo
             çesar           çesar           Óooo            Óooo
             óooo            óooo            óóóó            óóóó
             óóóó            óóóó            ÓÓÓÓ            ÓÓÓÓ

Configuração do locale na aplicação cliente


  • Variavel
    - CLIENT_LOCALE
    - DBLANG : Define path para diretorio de mensagens do GLS
    - DBMONEY : "R$(,)" = R$(12342,34)
    - GL_DATE : "%A, %d de %B de %Y " = "Sexta-feira, 15 de Fevereiro de 2008"
    - GL_DATETIME : ver manual
  • As váriaveis DBMONEY, GL_DATE e GL_DATETIME podem afetar o formatos utilizado para representaçao ao usuário independente do LOCALE definido.
    As variáveis DBDATE e DBTIME existem apenas por compatibilidade com versoes antigas, usar GL_* .
    Define formatos de valores monetários, data e representaçao numericas.
  • A definiçao destes formatos nao afetam o modo como o dado é gravado internamente no banco de dados.
  • Esta definiçao é utilizada na exibiçao dos dados ou na conversao inversa deles, onde é lido o dado literal (entre aspas) e convertido para o formato interno utilizado pelo banco.
    Exemplo:
    Se definido o LOCALE portugues/brasil, em uma SQL a informaçao "25/02/2008" (dia/mes/ano) é interpretada corretamente quando convertida para um campo do tipo DATE. DATE("25/02/2008")
Para maiores informaçoes, consultar manual Admin Reference e GLS Guide

Artigo copiado


Copiado do blog IDS Experts

IDS Experts

Wednesday December 10, 2008

Commonly Encountered GLS Errors:
--> Error -23101 Unable to load locale categories.

If you have variables CLIENT_LOCALE and DB_LOCALE set, following files must
exist otherwise it will result in error -23101.
- $INFORMIXDIR/gls/lc11/DB_LOCALE's(ll_tt)/(hex value of db's code set).lco
- $INFORMIXDIR/gls/lc11/CLIENT_LOCALE's(ll_tt)/(hex value of db's
code set).lco
- $INFORMIXDIR/gls/lc11/CLIENT_LOCALE's(ll_tt)/(hex value of
client's-codeset).lco
where ll_tt represents the language and the territory specified by the locale.

Hex value for any code set can be looked up in file
$INFORMIXDIR/gls/cm3/registry

For example:
say, DB_LOCALE = en_us.ut8 ............... (hex value for code set utf8 is e01c)
CLIENT_LOCALE = zh_cn.gb18030-2000 .. (hex value for code set
gb18030-2000 is 1570)

following files must exist:
- $INFORMIXDIR/gls/lc11/en_us/e01c.lco
- $INFORMIXDIR/gls/lc11/zh_cn/e01c.lco
- $INFORMIXDIR/gls/lc11/zh_cn/1570.lco

Missing any of these files will cause error -23101.

When GL_USEGLU is set (i.e. when using ICU implementation), you need to
check the following as well.
- Verify $INFORMIXDIR is set correctly.
- Ensure that ICU files are loaded correctly.

ICU files:
- $INFOMRIXDIR/gls/dll/* ........... (all 4 libraries must exist and
have execute permission)
- $INFORMIXDIR/gls/etc/* ........... (all 4 files must exist)

--> Error -23104 Error opening required code-set conversion object file.

Error -23104 is encountered if any of these files are missing:
- $INFORMIXDIR/gls/cv9/ccccdddd.cvo
- $INFORMIXDIR/gls/cv9/ddddcccc.cvo

where cccc is hex value for CLIENT_LOCALE's code set,
dddd is hex value for DB_LOCALE's code set,

assuming code set for CLIENT_LOCALE and DB_LOCALE are not the same.

Having same code set for CLIENT_LOCALE and DB_LOCALE means no code set
conversion is involved and hence no -23104 error.

For example:
If DB_LOCALE = en_us.ut8 ................(hex value of utf8 is e01c)
CLIENT_LOCALE = zh_cn.gb18030-2000 ...(hex value of gb18030 is 1570)

following files must exist, else it results in error -23104.
- $INFOMRIXDIR/gls/cv9/e01c1570.cvo
- $INFOMRIXDIR/gls/cv9/1570e01c.cvo

--> Error -23197 Database locale information mismatch.

Error -23197 is encountered if ...
- the code set specified by DB_LOCALE is not same as the code set of
database locale.
- the code set of locale_spec used in SET COLLATION sql statement is not
same as the code set of database locale.

* Database locale is the locale used when the database was created.
* To know your database locale, you can lookup for dbs_collate value in
sysmaster database by executing following command,
SELECT dbs_collate FROM sysmaster:sysdbslocale WHERE
dbs_dbsname = "<your database name>"
* Remember, if DB_LOCALE is not set, CLIENT_LOCALE is used as DB_LOCALE.

Seema Kumari

Categories : [ -23101 | -23104 | -23197 | Error | GLS ]

Dec 10 2008, 04:57:44 PM EST Permalink

4.333335
Média: 4.3 (6 votos)
Sua avaliação: Nenhum

Comentar

O conteúdo deste campo é privado não será exibido ao público.
  • Endereços de páginas de internet e emails viram links automaticamente.
  • Você pode usar tags BBCode no texto.
  • Tags HTML permitidas: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>

Mais informações sobre as opções de formatação

CAPTCHA
Este teste é para bloquear programas automatizados e previnir spams
CAPTCHA de Imagem
Digite o texto exibido na imagem.