Por que eu devo ler este artigo: Neste artigo serão abordadas algumas configurações que muitas vezes passam despercebidas quando se cria um banco de dados neste SBGD, demonstrando suas principais características e diferenças, e como elas podem afetar na visualização dos dados do usuário final.

Existem no mercado diversos fabricantes com diferentes tipos de SGBDs prontos para atender a todo o tipo de necessidade, desde simples usuários a grandes empresas. O Firebird é um SGBD que surgiu do projeto Borland.

InterBase 6, possuindo a vantagem de ser Open Source e multi-plataforma. Atualmente apresenta-se como uma boa opção de banco de dados Cliente/Servidor, robusta e confiável, gerenciando grandes bancos de dados com bom desempenho e com conexões simultâneas.

O Firebird é disponibilizado em três versões:

SuperServer
Versão mais utilizada, compartilha o cache entre as conexões com o banco de dados, e utiliza threads para gerenciar cada conexão cliente;
Classic
Usada em máquinas com mais de um processador e em algumas situações específicas, como sistemas operacionais que não dispõem de tecnologia para executar aplicações multi-thread, requerida pela versão SuperServer. Esta versão inicia um processo independente do servidor de dados para cada conexão cliente estabelecida;
Embedded
É um servidor Firebird totalmente funcional, mas sua instalação é composta por apenas alguns arquivos que deverão ser disponibilizados com a aplicação cliente. Desta forma, não há necessidade de instalação completa do SGBD nas máquinas cliente, sendo útil para distribuição da aplicação.

Para isso, deve-se instalar o SGBD do Firebird com a opção SuperServer e instalar também a ferramenta IBExpert para auxiliar na manipulação do banco de dados.

Configuração inicial do Firebird

Primeiro, deve-se criar um banco de dados de exemplo. Utilizando o IBExpert, execute o script da Listagem 1 através do menu Tools > Script Executive > Run Script e depois registre o banco em Database > Register Database (ver Figura 1).

O campo Font Characters Set que aparece na Figura 1 é a configuração da fonte da letra utilizada no IBExpert e não interfere em nenhuma configuração do banco de dados. No decorrer deste artigo, serão abordadas cada uma das configurações utilizadas no script para criação do banco de dados de exemplo (ver Listagem 1) como Dialetos, Set Names, Page Size, Character Set e Collation utilizados.

Visualização do Register Database
Figura 1. Visualização do Register Database.

Listagem 1. Script para a criação do banco de dados de exemplo


        /***********************************************************************/

        SET SQL DIALECT 1;

        SET NAMES WIN1252;



        CREATE DATABASE 'C:\CADASTRO.fdb'

        USER 'SYSDBA' PASSWORD 'masterkey'

        PAGE_SIZE 4096

        DEFAULT CHARACTER SET WIN1252;



        /***********************************************************************/

        CREATE TABLE PAISES (

        CODIGO INTEGER NOT NULL,

        NOME VARCHAR(50) COLLATE WIN_PTBR,

        DATA_CADASTRO DATE);



        INSERT INTO PAISES (CODIGO, NOME, DATA_CADASTRO) VALUES (1, 'África do Sul', '2007-08-25 00:00:00');

        INSERT INTO PAISES (CODIGO, NOME, DATA_CADASTRO) VALUES (2, 'Alemanha', '2007-08-25 00:00:00');

        INSERT INTO PAISES (CODIGO, NOME, DATA_CADASTRO) VALUES (3, 'Brasil', '2007-08-26 00:00:00');

        INSERT INTO PAISES (CODIGO, NOME, DATA_CADASTRO) VALUES (4, 'Japão', '2007-08-26 00:00:00');

        COMMIT WORK;



        /***********************************************************************/

        ALTER TABLE PAISES ADD CONSTRAINT PK_PAISES PRIMARY KEY (CODIGO);
        

Dialetos no Firebird

O Firebird baseia-se no conceito de dialetos para permitir utilizar novas características que não são compatíveis em versões anteriores do SGBD, como caracteres delimitados por aspas duplas e campos dos tipos data e hora. O uso de dialetos ajuda diretamente nesta transição, garantindo a compatibilidade com versões antigas dos bancos de dados. Pode-se definir o dialeto através do script de criação do banco (como na Listagem 1, que contém o comando SET SQL DIALECT 1) ou utilizando o IBExpert, acessando Database > Create Database e selecionando o dialeto no campo SQL Dialect (ver Figura 2).

Visualização do Create Database
Figura 2. Visualização do Create Database.

No Firebird existem três opções diferentes de dialetos

Dialeto 1:
Constantes alfanuméricas podem ser delimitadas por aspas simples ou duplas. O Dialeto 1 não reconhece identificadores delimitados, ou seja, nomes de objetos do Firebird como nomes de tabelas internas e campos do banco de dados - por exemplo, não é permitido criar uma tabela com o nome “PAISES” entre aspas. Armazena os campos do tipo data somente com o tipo DATE, que guarda data e hora no mesmo campo, mesmo se for necessário armazenar só a data. Os tipos de dados DECIMAL e NUMERIC com precisão maior que nove são gravados como float.
Dialeto 2:
O Dialeto 2 não deve ser utilizado para um banco de dados em produção, mas sim como um modo de diagnóstico para migração entre diferentes versões de um banco de dados. Este dialeto irá identificar incompatibilidades durante a migração de bancos do dialeto 1 para o 3 como, por exemplo, aquelas geradas por aspas duplas, campos dos tipos DATE e NUMERIC ou DECIMAL com precisão maior que nove.
Dialeto 3:
Constantes alfanuméricas devem ser delimitadas por aspas simples e aspas duplas são usadas somente em identificadores delimitados. Por exemplo, é permitido criar uma tabela com o nome “PAISES” entre aspas. O tipo de dado DATE armazena somente o valor da data, e dois novos tipos de dados foram acrescentados. O tipo de dado TIME que armazena somente os valores referentes a tempo, e TIMESTAMP que armazena ambos os valores de data e hora. O tipo de dado TIMESTAMP tem a função de manter a compatibilidade com o Dialeto 1. Os tipos de dados DECIMAL e NUMERIC com precisão maior que nove são gravados utilizando inteiros de 64 bits (INT64), mas todos os campos deste tipo continuam sendo armazenados como float se o banco de dados for migrado de alguma versão anterior.

Agora, para migrar nosso banco de exemplo para o Dialeto 3, será necessário alterar as seguintes linhas do script original, DIALECT 1 para DIALECT 3 e o tipo DATE para TIMESTAMP (ver Listagem 2). Como no Dialeto 3 o tipo DATE armazena somente a data, será necessário alterar o tipo do campo DATA_CADASTRO para TIMESTAMP para não ocorrer erro na hora de inserir os dados, já que possuem originalmente valores de data e hora juntos. Não é possível alterar diretamente o dialeto no banco de dados. A alteração do dialeto só pode ser feita recriando o banco.

Listagem 2. Alteração do script para o Dialeto 3.

        /***********************************************************************/

        SET SQL DIALECT 3;

        ...



        /***********************************************************************/

        CREATE TABLE PAISES (

        CODIGO INTEGER NOT NULL,

        NOME VARCHAR(50) COLLATE WIN_PTBR,

        DATA_CADASTRO TIMESTAMP);

        ...
        

Ao criar um novo banco de dados no Firebird, a não ser que seja necessário manter compatibilidade com bancos de dados de versões anteriores, o ideal é utilizar o Dialeto 3, pois permite total acesso a novos recursos de futuras versões do Firebird. O Dialeto 3 ainda dispõe de três novas funções para obter data e hora do sistema:

  • CURRENT_TIMESTAMP: para obter a data e hora do sistema;
  • CURRENT_DATE: para obter a data do sistema;
  • CURRENT_TIME: para obter a hora do sistema.

Ao executar a query da Listagem 3, a consulta irá retornar todos os países que possuem o valor do campo DATA_CADASTRO igual à data atual do sistema.

Listagem 3. Consulta paises.


        select * from PAISES where DATA_CADASTRO = CURRENT_DATE
        

Page Size

Na criação do banco de dados (ver Figura 2), pode-se especificar o tamanho da página de dados do banco em bytes, podendo ser definido levando em consideração o tamanho do cluster do servidor de dados. Criar uma base de dados com um tamanho da página de 4096 pode ser visto como uma boa opção, pois este é o tamanho do cluster do Windows Server 2003, por exemplo. Consequentemente, os tamanhos maiores só irão trazer alguma vantagem de desempenho se o tamanho dos clusters forem maiores também.

O Page Size deve ser definido no script de criação do banco (ver Listagem 1, que contém o comando PAGE_SIZE 4096). Utilizando o IBExpert pode-se selecionar o valor desejado no campo Page Size (ver Figura 2). O valor default do Page Size pode ser alterado ao fazer um restore do banco de dados (ver Listagem 4).

Listagem 4. Alterar Page Size


        -- Restore do banco utilizando o utilitário gBak

        gbak –user SYSDBA –pas masterkey –r –p 8192 -o c:\CADASTRO.fbk localhost:c:\CADASTRO.fdb
        

O Page Size também irá determinar o tamanho máximo de um campo do tipo blob. Enquanto os tipos de dados varchar possuem o tamanho limitado em 32 Kb, o tamanho máximo de um tipo de dado blob será determinado da seguinte forma:

  • 1 Kb page size: 64 Mb blob;
  • 2 Kb page size: 512 Mb blob;
  • 4 Kb page size: 4 Gb blob;
  • 8 Kb page size: 32 Gb blob;
  • 16 Kb page size: maior que 32 Gb blob.

Character Set

O Character Set, também chamado de página de código, irá definir um conjunto de caracteres de determinado alfabeto que deverão ser aceitos pelo banco de dados, influenciando diretamente na utilização de caracteres especais. Desta forma, deve-se escolher o Character Set a ser utilizado pelo banco de dados de acordo com as configurações regionais e plataforma do sistema operacional com que se irá trabalhar, evitando assim, problemas na hora da gravação de dados no banco.

Os Character Sets ISO8859_1 e WIN1252 são muito parecidos. Suas diferenças estão em alguns caracteres especiais e nas características de seus Collates, que serão abordados no decorrer deste artigo. Normalmente, o Character Set ISO8859_1 é utilizado em bancos de dados hospedados em plataforma Linux e o Character Set WIN1252 em bancos hospedados em plataforma Windows. Através da Tabela 1 pode-se visualizar alguns dos principais tipos de Character Set e Collation suportados pelo Firebird.

Tabela 1. Alguns tipos de Character Sets aceitos no Firebird 2.0

Região Character Set Collation Comentários
Todas NONE NONE Sem character set e collation aplicado, o Firebird será incapaz de executar operações de ordenação e comparação de caracteres de maneira correta.
Europa Ocidental ISO8859_1 ISO8859_1 Latin-1, default para Linux
DE_DE Alemão/Alemanha
EN_UK Inglês/Inglaterra
EN_US Inglês/Estados Unidos
ES_ES Espanhol/Espanha
PT_BR Português/Brasil, Case+Accent insensitive (Firebird 2.0)
Europa Ocidental, Américas WIN1252 WIN1252 Latin-1, com extensões de Windows
WIN_PTBR Português/Brasil, Case+Accent insensitive (Firebird 2.0)
PXW_INTL850 Paradox Multi-Lingual Latin-1
PXW_SPAN Paradox Espanhol
China BIG_5 BIG_5 Chinês

Se em nosso banco de dados o campo NOME passar a utilizar o Character Set BIG_5 (Chinese), por exemplo, não será possível incluir os dados da instrução SQL da Listagem 5, pois o caractere acentuado ‘Á’ não pertence ao conjunto de caracteres válidos para este Character Set, gerando um erro na hora de incluir este registro (ver Figura 3).

Listagem 5. SQL inserir registro.

Erro Character Set
Figura 3. Erro Character Set.

A definição do Character Set em um banco de dados pode ser feita através de um valor default para todo o banco ou diretamente nos campos de uma tabela (ver Listagem 6), e para definir o Character Set default utilizando o IBExpert, basta selecionar o valor desejado no campo Charset (ver Figura 2). Para alterar o valor default do Character Set de um banco de dados em produção é necessário recriá-lo alterando o script de criação do banco para o valor desejado.

Listagem 6. Scripts definindo Character Set


        -- Ao criar o banco de dados

        CREATE DATABASE

        USER

        PASSWORD

        PAGE_SIZE

        DEFAULT CHARACTER SET



        -- Ao criar campos em uma tabela

        CREATE TABLE TESTE (

        NOME VARCHAR(50) CHARACTER SET WIN1252,

        TIPO VARCHAR(15) CHARACTER SET WIN1252);
        

Set Names

Set Names especifica o conjunto de caracteres ativos, ajustando o uso do Character Set default do banco de dados (ver Listagem 7) com o Character Set usado em uma conexão cliente.

Listagem 7. Set Names.


        SET NAMES WIN1252;

        CONNECT 'C:\CADASTRO.FDB' USER 'SYSDBA' PASSWORD 'masterkey';
        

É importante definir o Character Set utilizado tanto na base de dados como nas aplicações clientes desenvolvidas em uma determinada linguagem, para que a aplicação acesse corretamente o banco de dados. Se o Character Set de sua conexão cliente for diferente do Character Set do banco de dados, a comunicação entre o servidor e o cliente será mais lenta. Os dados deverão ser convertidos de um Character Set para outro sempre que o cliente enviar os dados para o servidor, e vice-versa. Um exemplo desta configuração pode ser observado através do componente SQLConnection da paleta dbExpress no Delphi (ver Figura 4).

Visualização do Value List editor, do componente SQLConnection no Delphi
Figura 4.Visualização do Value List editor, do componente SQLConnection no Delphi.

Collation

Para ser capaz de ordenar e comparar strings, é necessário escolher um Collation para definir qual é a ordem com que os caracteres de um determinado alfabeto deverão ser tratados para realizar classificações dos dados (por exemplo, tratar diferenciação entre caracteres minúsculos e maiúsculos, e diferenciação entre caracteres acentuados ou não). Assim, um Collation pode ser:

  • Case-insensitive: caracteres minúsculos e maiúsculos são iguais em qualquer comparação de tipos de dados string;
  • Accent-insensitive: caracteres acentuados ou não são iguais em qualquer comparação de tipos de dados string.

Na hora de efetuar uma consulta, a característica de ser Case-insensitive ou Accent-insensitive dependerá exclusivamente do Collate escolhido, podendo haver em um mesmo Character Set, Collates com estas características ou não. Pode-se definir o Collate ao se criar campos em uma tabela, ou pode-se definir na hora de realizar uma consulta (ver Listagem 8).

Listagem 8. Scripts definindo Collation


        -- Nos campos de uma tabela

        CREATE TABLE TESTE (

        NOME VARCHAR(50) CHARACTER SET WIN1252 COLLATE WIN_PTBR,

        TIPO VARCHAR(15) CHARACTER SET WIN1252 COLLATE PXW_INTL850);



        -- Order by

        ORDER BY NOME COLLATE WIN_PTBR



        -- Clausula Where

        WHERE NOME COLLATE WIN_PTBR = 'Brasil'
        

Muitos desenvolvedores utilizam o Character Set WIN1252 com o COLLATE PXW_INTL850 para utilizar a ordenação correta para o português e manter compatibilidade com programas que utilizam o BDE para conexão com o banco de dados. A partir da versão 2.0 do Firebird foi adicionado o novo COLLATE WIN_PTBR, que além de possuir a ordenação correta para o português é Case-insensitive e Accent-insensitive, e pode-se criar um índice com campo de até 250 caracteres, enquanto Collates mais antigos aceitam somente até 83 caracteres.

No intuito de demonstrar as características de um Collate em uma consulta, vamos executar a query select * from PAISES where NOME = 'japao' no banco CADASTRO.FDB, onde o campo NOME possui o COLLATE WIN_PTBR (ver Listagem 1). O resultado da consulta será o apresentado na Tabela 2. Mesmo se alterarmos o valor para ‘Japão’, ‘JAPAO’ ou ‘JAPÃO’, o resultado será o mesmo.

Tabela 2. Resultado da query com COLLATE WIN_PTBR.

CÓDIGO NOME DATA_CADASTRO
5 Japão 26/08/2007 00:00:00

Agora, se alterarmos a query para select * from PAISES where NOME collate PXW_INTL850 = 'japao', o resultado será o apresentado na Tabela 3. O resultado só retornará o valor desejado se o valor informado for igual a ‘Japão’ devido às características do COLLATE PXW_INTL850.

Tabela 3. Resultado da query com COLLATE PXW_INTL850.

CÓDIGO NOME DATA_CADASTRO

O Collation também irá influenciar diretamente na ordenação dos dados, desta forma, ao executar a query select * from PAISES order by NOME no banco de dados de exemplo CADASTRO.FDB, o resultado da consulta será o apresentado na Tabela 4.

Tabela 4. Resultado da query com COLLATE WIN_PTBR.

CÓDIGO NOME DATA_CADASTRO
1 África do Sul 25/08/2007 00:00:00
2 Alemanha 25/08/2007 00:00:00
3 Brasil 25/08/2007 00:00:00
4 Japão 25/08/2007 00:00:00

Mas, se a consulta for realizada pela query select * from PAISES order by NOME collate WIN1252 o resultado será diferente (ver Tabela 5) devido à alteração do COLLATE na cláusula ORDER BY da consulta.

Tabela 5. Resultado da query com COLLATE WIN1252.

CÓDIGO NOME DATA_CADASTRO
2 Alemanha 25/08/2007 00:00:00
3 Brasil 25/08/2007 00:00:00
4 Japão 25/08/2007 00:00:00
1 África do Sul 25/08/2007 00:00:00
Conclusões

O Firebird procura cada vez mais ser compatível com os padrões definidos para o SQL-ANSI-92, fornecendo novas palavras reservadas, regras de sintaxe que aumentam a capacidade de criação de consultas, filtros e instruções SQL. Possuindo ainda a flexibilidade de rodar em diversas plataformas como Windows, Linux, Unix e Mac OS.

A correta configuração de seus parâmetros leva à construção de bancos de dados mais robustos e confiáveis, otimizando o seu desempenho na manipulação de dados.

Saiu na DevMedia!

  • Série Autenticação em Aplicações Web:
    Tornar algumas páginas acessíveis apenas a um grupo de usuários autenticados é uma tarefa trivial em aplicações web. Existem diferentes frameworks para isso, mas a maioria deles cobre desde o cadastro até as credenciais, passando pela autenticação e controle de acesso. Quer saber qual a lógica por trás dessas etapas?
  • CSS: da Sintaxe ao Flexbox:
    CSS é um item que não pode faltar na caixa de ferramentas de um programador web, pois é com ela que descrevemos para o navegador como os elementos em uma página serão apresentados para o usuário.

Saiba mais sobre Firebird ;)

  • Trabalhando com joins no Firebird:
    Veja neste artigo como trabalhar Joins no Firebird e aprenda também o conceito, os tipos suportados, e como e quando usar cada tipo de Join.
Revista SQL Magazine Edição 48
Confira nesta edição da SQL Magazine, como definir e manter índices no SQL Server, postgreSQL e MySQL e veja também o que são deferred constraints e como utilizá-las.