Conjunto De Caracteres Da Base De Dados Oracle
Como posso manter os caracteres especiais no meu pacote, quando compilo usando o sqlplus ou qualquer outra ferramenta?
NLS_CHARACTERSET: WE8MSWIN1252
Os caracteres do cliente definidos: desconhecido
O problema é: Apresentação dos dados
OS e DB: UNIX \ Oracle Database 12c Enterprise Edition Release 12.1.0.2.0-64bit ProductionOracle Database 12c Enterprise Edition Release 12.1.0.2.0-64bit Production
PL / SQL Release 12.1.0.2.0-Production
Produção principal 12.1.0.2.0
TNS Para Linux: versão 12.1.0.2.0-Produção
NLSRTL Version 12.1.0.2.0-Production
Exemplo:
CREATE OR REPLACE PACKAGE BODY pkg1
AS
procedure sp
IS
v_var VARCHAR2(100);
BEGIN
v_var := '**último**';
END;
END;
quando descrevo o pacote parece-se com isto:
CREATE OR REPLACE PACKAGE BODY HR.pkg1
AS
procedure sp
IS
v_var VARCHAR2(100);
BEGIN
v_var := '**£ltimo**';
END;
END;
1 answers
Existe uma forma genérica de introduzir dados unicode arbitrários em bases de dados oracle limitando-se à codificação ascii:
-
Determine a representação utf-8 do texto alvo como uma sequência de bytes em hex.
Use um editor utf8-savvy e indique o texto que deseja transferir para o db. Muitos editores vêm com um modo hex que lhe permite inspecionar a representação utf8 e escrevê-lo em outro lugar. Em alternativa, use um editor hexadecimal dedicado ou use o cli ferramentas como
od
(linux) para produzir conteúdo de ficheiros como uma sequência tabulada de octetos representados em hex:od --output-duplicates --format x1 --width=16 demo.txt
A saída precisa de algum pós-processamento para se livrar dos números de linha e espaços em branco, no entanto, isso deve ser simples. Para os dados a granel, utilizar
sed
ou uma ferramenta semelhante. -
Converte a cadeia hexadecimal para o tipo de dados do oráculo.
Chamar em PlSql faz o truque. -
Converta os dados
raw
paravarchar2
, ou seja. banco caracter.Utilizar o procedimento do pacote plsql
utl_i18n.raw_to_char
. Seu segundo argumento especifica a codificação de código.
Em resumo, o método resume-se a uma consulta semelhante a (o texto de teste são as letras minúsculas a
até f
seguido pelos umlauts alemães ) :
select utl_i18n.raw_to_char ( hextoraw ( '616263646566c3a4c3b6c3bcc384c396c39cc39f' ), 'AL32UTF8' ) from dual;
No seu pacote escreveria:
v_var := '**' || utl_i18n.raw_to_char ( hextoraw ( 'c3ba' ), 'AL32UTF8' )
|| 'ltimo**';
-- c3ba being the utf8 encoding of unicode codepoint U+00fa,
-- 'LATIN SMALL LETTER U WITH ACUTE'
Obviamente, a técnica só funciona se o conjunto de caracteres da base de dados for capaz de representar os caracteres na primeira lugar.
Atalhos
-
Você pode usar qualquer outra codificação fonte em que os caracteres especiais que você precisa sejam representáveis, desde que o db esteja ciente dessa codificação. Nomeadamente, pode ser utilizada a Série iso 8859-x de codificações para alfabetos latinos. No seu caso para
ú
e iso8859-1:v_var := utl_i18n.raw_to_char ( hextoraw ( 'fa' ), 'WE8ISO8859P1' ) from dual;
-
Usando o conjunto de caracteres nacional no seu db, pode introduzir caracteres unicode pelos seus pontos de código nas suas cadeias literais. Basta embrulhar o literal cordas com a função
UNISTR
:v_var := TO_CHAR(UNISTR('**\00faltimo**')) from dual;