Artigos

Como ter um Banco de Dados Case Insensitive e Accent Insensitive no Firebird 2.0

Por Guilhermo González - abril/2009

Existem na verdade, 2 maneiras.

Na primeira, o BD deve ter um CharSet (codificação de caracteres) definido, e as colunas das tabelas com o Collate definido.

Essa maneira é vantajosa caso na aplicação tenham várias colunas em que podem ser registrados carateres com letras maiúsculas e/ou acentos.

Como criar um BD com CharSet definido:
Ex:
SQL> CREATE DATABASE 'localhost:C:\Data\test.fdb' USER 'SYSDBA' PASSWORD 'masterkey' PAGE_SIZE 8192 DEFAULT CHARACTER SET ISO8859_1;

Se conecte no BD criado.
Ex:
SQL> CONNECT 'localhost:C:\Data\test.fdb' user 'SYSDBA' password 'masterkey';

E crie uma tabela seguindo o exemplo, definindo o Collate desejado para cada coluna em que seja necessário.
Ex:
SQL> CREATE TABLE pessoa (nome VARCHAR(50) COLLATE PT_BR, sobrenome VARCHAR(50) COLLATE PT_BR);

Também é possível, caso não queira ter um CharSet definido para toda a tabela, é definir um CharSet para cada coluna desejada.
Ex:
SQL> CREATE TABLE pessoa (nome VARCHAR(50) CHARACTER SET ISO8859_1 COLLATE PT_BR);

Dessa maneira, em um Select, não é necessário que seja definido um Collate, uma vez que ele já está definido na coluna.
Ex:
SQL> SELECT * FROM pessoa WHERE nome = 'joao';
Retornará: João, Joao, joão, joao.

 

A segunda maneira é util quando o CharSet não foi definido nem no BD quanto nas colunas, para isso, deve-se definir um Collate em cada Select feito na aplicação. Essa maneira porém, não é aconselhada caso sejam feitos vários Selects em que se queira que os caracteres maiúsculos e minúsculos sejam diferenciados assim como os caracteres acentuados e não acentuados, já que seria necessário um Collate para cada Select.
Ex:
SQL> SELECT * FROM pessoa WHERE nome = 'joao' COLLATE PT_BR;
Retornará: João, Joao, joão, joao.