Funcionamento do Global Language Support (LOCALE)
GLS = Global Language Support
Collation = Conjunto, compilaçao
Locale = Local, localizaçao
Code Set/Page = Código de pagina (pt_BR.819)
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.819Poré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")
Artigo copiado
Copiado do blog 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
- 263 leituras





Comentar