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.