XOOPS Brasil

 

9.6. UTF8 para Metdados

O metadados é o dado sobre o dado. Qualquer coisa que descreva os bancos de dados, como o opsto de ser o conteúdo do banco de dados, é metadados. Assim nomes de colunas, banco de dados, utilizadores, versões e a maioria dos resultados strings de SHOW, são metadados.

Todos os metadados devem estar no mesmo conjunto de caracteres. (Senão, SHOW não funcionaria corretamente devido aos diferentes registros na mesma coluna estarem em conjunto de caracteres diferentes). Por outro lado, metadados devem incluir todos os caracteres em todas as linguagens (senào os utilizadores não poderiam nomear as colunas e tabelas na suas próprias linguagens). Para permitir ambos os objetivos, o MySQL armazena metadados em um conjunto de caracteres Unicode, chamado UTF8. Isto não causa qualquer rompimento se você nunca usar caracteres acentuados. Mas se você fizer, deverá estar ciente que o metadado está em UTF8.

Isto significa que funções USER() (e seus sinônimos), SESSION_USER() and SYSTEM_USER()), CURRENT_USER(), e VERSION() terá o conjunto de caracteres UTF8 por padrão.

Isto NÃO significa que o cabeçalho das colunas e os resultados da função DESCRIBE estarão no conjunto de caracteres UTF8 por padrão. (Quando você fizer SELECT column1 FROM t o nome column1 será retornado do servidor para o cliente no conjunto de caracteres do cliente como determinado pela instrução SET NAMES.)

Se você quizer que o servidor passe o resultado de volta em um conjunto de caracteres não-UTF8, então use SET CHARACTER SET para forçar o servidor a converter (see Seção 9.3.6, “Conjunto de Caracteres e Collation de Conexão”), ou configurar o cliente para fazer a a conversão, mas esta opção não estará disponível para muitos clientes até no final no ciclo do produto MySQL 4.x.

Se você está apenas usando, por exemplo, a função USER() para comparação ou atribuição dentro de uma única instrução ... não preocupe. O MySQL fará alguma conversão automática para você.

SELECT * FROM Table1 WHERE USER() = latin1_column;

Isto funcionará, porque o conteúdo de latin1_column é convertido automaticamente para UTF8 antes da comparação.

INSERT INTO Table1 (latin1_column) SELECT USER();

Isto funcionará, porque o contéudo de USER() é convertido automaticamente para latin1 antes da atribuição. A conversão automática ainda não está totalmente implementada, mas deve funcionar corretamente em uma versão posterior.

Embora a conversão automática não esteja no padrão SQL, o documento do padrão SQL diz que todo conjunto de caracteres é (em termos de caracteres suportados) um ``subconjunto'' do Unicode. Desde que isto seja um princípio bem conhecido que ``o que aplica a um superconjunto pode ser aplicado a um subconjunto'', acreditamos que uma collation para Unicode pode ser aplicado para comparações com strings não -Unicode.

NATA DA VERSÃO 4.1.1: Os arquivos errmsg.txt estarão todos em UTF8 depois deste ponto. Conversão o conjunto de caracteres do clientes serão automáticos, como para metadados. Também: Podemos alterar o comportamento padrão para passar de volta o metadado do resultado em um futuro próximo.