Oracle Database – Character Set

bagadbold

Olá! Bom dia, boa tarde, boa noite!!!
O post de hoje é pedido de um aluno do Projeto DBA e realmente é um assunto bem interessante.
Hoje vou comentar a respeito do CHARACTER SET no ambiente de banco de dados Oracle.

Sei que nesse momento, alguns que já tiveram problema com isso estão relembrando e pensando que pesadelo… Acredite, eu sei bem o que você passou. Afinal de contas esta é uma daquelas configurações do tipo “Fale agora ou cale-se para sempre” sabe? Sim! Aquelas que você define na instalação e depois é um Deus nos acuda se precisar alterar algo.

Vamos primeiramente entender quem ele é
Character set é o nome que se dá a um conjunto de caracteres específico utilizado no banco de dados.
Porém ele não é de utilização somente para databases. Quando qualquer sistema armazena, processa algum tipo de caracter, exemplo a letra “R” ele utiliza um código numérico que representa a letra e não a letra propriamente dita. Este código é o nosso character set.

O Oracle o utiliza em algumas situações tais como:

  • Armazenar dados em tipos de dados caracteres SQL (CHAR, VARCHAR2, CLOB e LONG).
  • Para nomear objetos como por exemplo nomes de tabela, nomes de colunas e variáveis em PL / SQL.
  • SQL armazenados e código-fonte PL/SQL, incluindo literais de texto incorporados neste código.

 É através dele que o banco de dados pode reconhecer caracteres como cedilha, acentos, etc.
Definir qual padrão utilizar tem muito a ver com definir o conjunto de caracteres da maioria dos clients que se conectam nesse banco de dados.

Para ficar mais fácil de entender o que seria este tal character set vamos a uma dica: Sabe aquelas letrinhas que mais parecem desenhos do idioma Japonês, ou então aquela escrita árabe?? Então, cada um terá um character set diferente. Agora se imaginarmos a escrita brasileira e a inglesa por exemplo, vemos que utilizamos o mesmo conjunto de caracteres.
Então ele não define o idioma e sim o conjunto de caracteres que será utilizado.

Existe um tipo tido como sugerido na maioria das instalações que é o UTF-8, ele é considerado como character set universal por suportar a maioria dos idiomas do mundo.

Imaginemos então que o DBA precisa saber qual o character set que foi definido para determinado banco de dados. Abaixo segue um script que demonstra isso facilmente:

SELECT value$ FROM sys.props$ WHERE name= 'NLS_CHARACTERSET';

 Também poderá querer saber detalhadamente como está configurado o seu padrão escolhido.

SELECT * FROM NLS_DATABASE_PARAMETERS;

Supondo que o primeiro script retorne  AL32UTF8 você pode estar se perguntando: “O que realmente significa esta codificação? Qual a convenção usada para montar este nome?

<region><number of bits used to represent a character><standard character set name>

Pegando o exemplo do AL32UTF8 fica mais fácil de entender. E neste caso o AL significa all pois pode ser usado em praticamente todos os idiomas conforme já comentado acima.

Pegando mais um exemplo WE8ISO8859P1. Onde o WE é Western European (Europa Ocidental).

Exemplos de nomes:characterset

 Caso necessite alteração:
Como falei acima o ideal é que não precise alteração, porém caso ela seja mesmo necessária poderá ser “tentado” fazer (sim, nem sempre será possível) utilizando-se dois scripts que vem no banco de dados data scanning (csscan) e data conversion (csalter).

Primeiro se faz o csscan que irá verificar o que converter:

No Linux faça:

[oracle@projdba1~]$ csscan
     
     Character Set Scanner v2.2 : Release 11.2.0.3.0 – Production on Wed Oct 05 10:22:10 2013
     Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
     Username: system
     Password:
     Connected to:
     Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 – Production
     With the Partitioning, OLAP, Data Mining and Real Application Testing options
     (1)Full database, (2)User, (3)Table, (4)Column: 1 > 1 — opção que escolho para analisar o banco todo
     Current database character set is WE8ISO8859P1.
     Enter new database character set name: > WE8MSWIN125 — para qual quero converter
E para as questões seguintes ENTER para utilizar o valor padrão. Na sequência será iniciado o scan nas tabelas do BD.
          Enumerating tables to scan…
     . process 1 scanning SYS.SOURCE$[AAAABIAABAAAAIRAAA]     …
      Creating Database Scan Summary Report…
     Creating Individual Exception Report…
      Scanner terminated successfully.

Serão criados três arquivos na pasta onde o usuário se encontrava (no meu caso /home/oracle) scan.out, scan.err e scan.txt com informações a respeito da análise do scan feito.

O próximo passo é rodar o script “csalter.plb” que encontra-se no diretório “$ORACLE_HOME/rdbms/admin” e deve ser executado com o usuário SYS.

SQL> SHUTDOWN IMMEDIATE
     Database closed.
     Database dismounted.
     ORACLE instance shut down.
     SQL> STARTUP RESTRICT
     ORACLE instance started.
     Total System Global Area 456146944 bytes
     Fixed Size 1345604 bytes
     Variable Size 369100732 bytes
     Database Buffers 79691776 bytes
     Redo Buffers 6008832 bytes
     Database mounted.
     Database opened.
     SQL> @?/rdbms/admin/csalter.plb
     0 rows created.
     Function created.
     Function created.
     Procedure created.
     This script will update the content of the Oracle Data Dictionary.
     Please ensure you have a full backup before initiating this procedure.
     Would you like to proceed (Y/N)?Y
     old 6: if (UPPER(‘&conf’) <> ‘Y’) then
     new 6: if (UPPER(‘Y’) <> ‘Y’) then
     Checking data validility…
     begin converting system objects
     PL/SQL procedure successfully completed.
     Alter the database character set…
     CSALTER operation completed, please restart database
     PL/SQL procedure successfully completed.
     0 rows deleted.
     Function dropped.
     Function dropped.
     Procedure dropped.
     SQL>

Para verificar se está OK faça:

SELECT value FROM nls_database_parameters where parameter='NLS_CHARACTERSET';

A Oracle possui também uma outra ferramenta visual, o Oracle Data Migration Assistant for Unicode.

Caso tenha interesse poderá ver mais em:

http://www.oracle.com/technetwork/products/globalization/dmu/learnmore/start-334681.html

Oportunidade única…

Se você gostou desse post, que tal aprender ainda mais com o Projeto DBA? Ter a chance de dar um upgrade na sua carreira através de uma oportunidade única de participar de todos os cursos do projeto DBA pagando apenas R$ 350,00.
Isso mesmo! R$ 350,00 por todos os cursos listados no projeto.

Cursos do pacote completo
  1. DBA Jr
  2. DBA Pleno
  3. Básico de SQL
  4. Oracle RAC
  5. Tuning de banco de dados
  6. Disaster e Recovery

Curso completo Apenas R$ 350,00:

Pague com PagSeguro - é rápido, grátis e seguro!

Dúvidas, saiba mais em projetodba.com.br/sucesso

Sobre raul andrade

DBA e Instrutor Oracle, apaixonado pela minha família e por ensinar.
Esta entrada foi publicada em Conhecimento, DBA Oracle e marcada com a tag , . Adicione o link permanente aos seus favoritos.

Deixe uma resposta