Problema com UPDATE de caracteres chineses

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
Roberto.Lima
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Qua, 12 Dez 2012 10:07 am

Olá pessoal!

Estou trabalhando com um projeto no qual será global e aplicado para cerca de 80 países e o sistema tem que aceitar caracteres chineses e outros idiomas que são bem diferentes do nosso.

Primeiramente gostaria de compartilhar algumas informações que serão úteis para análise.

Selecionar tudo

NLS_LANGUAGE:	AMERICAN
NLS_CHARACTERSET:	WE8ISO8859P1
NLS_NCHAR_CHARACTERSET:	AL16UTF16

Eu até consegui armazenar caracteres chineses salvando em Unicode no banco em campos NVARCHAR2, porém o que era pra ser 1 caractere no banco é salvo 8 posições, veja exemplo abaixo:

Estou salvando desta forma na minha aplicação que esta desenvolvida com a linguagem ASP:

Selecionar tudo

sql = "update TABELA_TRADUCAO SET chines_simp = UNISTR('"&server.HTMLEncode("语言测试")&"') where pkni_traducao=529"
Conn.execute(sql)
O que era pra ser isso: 语言测试 no banco fica isso: 语言测试
O que era pra ser isso: no banco fica isso: 产 , ou seja, sempre multiplicando por 8x o que deve ser normal para UTF.
Outra coisa estranha que notei, se eu faço o update direto no pl/sql não salva corretamente, veja como fica no banco: í KÕ.

Já tentei fazer update com N’语言测试’ e UNISTR(‘语言测试’) mesmo assim não da certo.
O engraçado é que pela GUI do PL/SQL eu copio os caracteres chineses e dou um Ctrl+V para editar pela parte gráfica e salva corretamente com os caracteres chineses ocupando a posição que deveria ocupar normalmente.

Sei que esta meio extenso o post mas gostaria de ajuda de vocês sobre como eu posso salvar os caracteres chineses manualmente de forma que fique igual a como faço o update na GUI do PL/SQL.

Se precisarem de mais alguma informação por favor me deixem saber e de antemão agradeço a ajuda dos amigos.
Roberto.Lima
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Qua, 12 Dez 2012 10:07 am

Olá galera!

Consegui evoluir um pouco com meu problema e gostaria de compartilhar.
No arquivo SQLDeveloper.config do Oracle SQL Developer eu coloquei a seguinte configuração:

Selecionar tudo

ORA_NCHAR_LITERAL_REPLACE=TRUE
AddVMOption -Doracle.jdbc.convertNcharLiterals=true
Com isso agora consigo fazer updates usando o N'国的'
Funciona perfeitamente, agora o que eu preciso é de alguma forma setar a confiuração ORA_NCHAR_LITERAL_REPLACE=TRUE na string de conexão com o Oracle, porque através da minha aplicação ASP ainda não consigo fazer updates com o N''.

Alguém tem alguma sugestão?

Agradeço de antemão.
Roberto Lima
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Roberto,
Posso talvez estar falando uma bobagem, mas este parâmetro que você precisa secar, você consegue fazer isso com o comando ALTER SESSION?
Se a resposta for sim, eu recomendaria você criar uma trigger de logon em seu banco de dados.
Esta trigger seria disparada quando um login fosse efetuado e - dependendo do usuário - poderia executar um ALTER SESSION para configurar a sessão do usuário com esta configuração.
Se achar que a trigger resolveria, mas não sabe como fazer, poste sua duvida aqui.
Abraços,
Sergio Coutinho
Roberto.Lima
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Qua, 12 Dez 2012 10:07 am

Infelizmente não é tão simples, li na internet que se trata de uma "enviroment variable", portanto creio que deva ser setada no servidor do Oracle, o problema é que não tenho acesso ao mesmo e fica dificil de solicitar testes sem saber se vai resolver ou não.

Alguma outra sugestão?
Grato,
Roberto Lima.
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Roberto,

Entendo a dificuldade de acesso ao ambiente (algumas vezes passo pela mesma situação).

Mas talvez você pudesse criar uma pequena base 11G XE (dentro de uma VIRTUALBOX) e tentar fazer os testes nela, pois aí você teria domínio sobre todos os pontos. Com isso você poderia testar uma solução e ter grande segurança quando apresentasse uma solução para implementar neste ambiente de acesso limitado.

Por acaso você teria acesso ao METALINK? Talvez os artigos de lá (melhor seria a abertura de uma SR) possam lhe ajudar.

Gostaria de poder lhe ajudar mais. Se me surgir alguma idéia, vou postar aqui. Lhe peço o mesmo, se você conseguir encontrar uma solução, pois com certeza isso ajudaria outros foristas.

Pode ser que os foristas possam ter outras idéias sobre este tema.

Abraços,

Sergio Coutinho
Roberto.Lima
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Qua, 12 Dez 2012 10:07 am

Agradeço o empenho do amigo na sugestão de alternativas, o jeito vai ser montar uma base oracle na minha casa e testar, certamente quando eu encontrar alguma solução irei compartilhar com os demais amigos.

Grato,
Roberto Lima.
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Roberto,

Uma sugestão para quando montar sua base XE (cujo NLS_NCHAR_CHARACTERSET tem que ser mesmo AL16UTF16 ):

Tente mudar o NLS_LANG para um destes idiomas

Selecionar tudo

American + Chinese (PRC)
 AMERICAN_AMERICA.ZHS16GBK
 
American + Chinese (Taiwan)
 AMERICAN_AMERICA.ZHT16MSWIN950
E digamos que alguma destas configurações resolva o seu problema. Neste caso, você poderia criar uma TRIGGER de LOGON para fazer um ALTER SESSION para um destes idiomas desejado.

Boa sorte !

Sergio Coutinho
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 14 visitantes