XOOPS Brasil

 

4.7. Localização do MySQL e Utilização Internacional

4.7.1. O Conjunto de Caracteres Utilizado para Dados e Ordenação

Por padrão, o MySQL utiliza o conjunto de caracteres ISO-8859-1 (Latin1) com ordenação de acordo com o sueco/finlandês. Este também é o conjunto de caracteres aplicável nos EUA e oeste da Europa.

Todos os binários padrões do MySQL são compilados com --with-extra-charsets=complex. Isto adicionará código a todos os programas padrões para estarem aptos a lidar com o conjuntos de caracteres latin1 e todos os multi-byte no binário. Outros conjuntos de caracteres serão carregados de um arquivo de definições de conjuntos de caracteres quando necessários.

O conjunto de caracteres determina quais são os caracteres permitidos em nomes e qual a forma de ordenação por cláusulas ORDER BY e GROUP BY da instrução SELECT.

Você pode alterar o conjunto de caracteres com a opção --default-character-set na inicialização do servidor. Os conjuntos de caracteres disponíveis dependem dos parâmetros --with-charset=charset e --with-extra-charset= list-of-charset | complex | all | none e os arquivos de configurações de conjuntos de caracteres listados em SHAREDIR/charsets/ Index. Veja mais informações sobre isto na Seção 2.3.3, “Opções típicas do configure.

Se o conjunto de caracteres for alterado durante a execução do MySQL (que também pode alterar a ordenação), deve-se executar o 0myisamchk -r -q --set-character-set=charset em todas as tabelas. De outra forma seus índices podem não ser ordenados corretamente.

Quando um cliente conecta a um servidor MySQL, o servidor envia o conjunto de caracteres padrão em uso ao cliente. O cliente irá alternar para o uso deste conjunto de caracteres nesta conexão.

Deve ser utilizado mysql_real_escape_string() quando desejar ignorar seguências de caracteres em uma consulta SQL. mysql_real_escape_string() é identico à antiga função mysql_espace_string(), exceto pelo fato de usar a manipulador de conexão MySQL como o primeiro parâmetro.

Se o cliente for compilado com o caminho diferente daquele onde o servidor está instalado e o utilizador que configurou o MySQL não incluiu todos os conjuntos de caracteres no binários do MySQL, deve ser especificado para o cliente onde ele pode encontrar os conjuntos de caracteres adcicionais que serão necessários se o servidor executar com um conjunto de caracteres diferente do cliente.

Isto pode ser especificado colocando em um arquivo de opções do MySQL:

[client]
character-sets-dir=/usr/local/mysql/share/mysql/charsets

onde o caminho aponta para onde os conjuntos de caracteres dinâmicos do MySQL são armazenados.

Pode-se forçar o cliente a usar conjuntos de caracteres específicos especificando:

[client]
default-character-set=nome-conjunto-caracteres

mas normalmente isto nunca será necessário.

4.7.1.1. German character set

Para se fazer ordenação em Alemão, você deve iniciar o mysqld com --default-character-set=latin1_de. Isto lhe dará as seguintes caracteristicas.

Ao ordenar e comparar strings, o seguinte mapeamento é feito na string antes de fazer a comparação:

ä -> ae
ö -> oe
ü -> ue
ß -> ss

Todos os caracteres acentuados, são convertidos para suas contra partes sem acentos e em letras maiúsculas. Todas as letras são convertidas para maiúsculas.

Ao compara strings com LIKE o mapeamento de caracteres de um -> dois não é feito. Todas as letras são convertidas para maiúsculas. Acentos são removidos para todas as letras exceto: Ü, ü, Ö, ö, Ä e ä.

4.7.2. Mensagens de Erros em Outras Línguas

mysqld pode exibir mensagens de erros nas seguintes línguas: Tcheco, Dinamarquês, Holandês, Inglês (padrão), Estonian, Francês, Alemão, Grego, Húngaro, Italiano, Japonês, Koreano, Norueguês, Norueguês-ny, Polonês, Português, Romeno, Russo, Eslovaco, Espanhol e Sueco.

Para iniciar o mysqld com uma língua particular, use uma das opções: --language=língua ou -L língua . Por exemplo:

shell> mysqld --language=swedish

ou:

shell> mysqld --language=/usr/local/share/swedish

Perceba que todos as línguas são especificados em minúsculas.

Os arquivos de linguagens estão localizados (por padrão) em mysql_base_dir/share/LANGUAGE/.

Para atualizar o arquivo com mensagens de erros, deve-se editar o arquivo errmsg.txt e executar o seguinte comando para gerar o arquivo errmsg.sys:

shell> comp_err errmsg.txt errmsg.sys

Se você atualizar o MySQL para uma versão mais nova, lembre-se de repetir as alterações no novo arquivo errmsg.txt.

4.7.3. Adicionando um Novo Conjunto de Caracteres

Para adicionar outro conjunto de caracteres ao MySQL, utilize o seguinte procedimento.

Decida se o conjunto é simples ou complexo. Se o conjunto de caracteres não necessitar do uso de rotinas especiais de classificação de strings para ordenação e também não necessitar de suporte à caracteres multi-byte, será simples. Se ele necessitar de alguns destes recursos, será complexo.

Por exemplo, latin1 e danish são conjuntos simples de caracteres enquanto big5 ou czech são conjuntos de caracteres complexos.

Na seguinte seção, assumimos que você nomeou seu conjunto de caracteres como MYSET.

Para um conjunto de caracteres simples use o seguinte:

  1. Adicione MYSET para o final do arquivo sql/share/charsets/Index Associe um número único ao mesmo.

  2. Crie o arquivo sql/share/charsets/MYSET.conf. (O arquivo sql/share/charsets/latin1.conf pode ser utilizado como base para isto).

    A sintaxe para o arquivo é muito simples:

    • Comentários iniciam com um caractere '#' e continuam até o fim da linha.

    • Palavras são separadas por quantidades arbitrárias de espaços em brancos.

    • Ao definir o conjunto de caracteres, cada palavra deve ser um número no formato hexadecimal

    • O vetor ctype obtêm as primeiras 257 palavras. Os vetores to_lower, to_upper e sort_order obtêm, cada um, as 256 palavras seguintes.

    Veja mais informações sobre isto na Seção 4.7.4, “Os Vetores de Definições de Caracteres”.

  3. Adicione o nome do conjunto de caracteres às listas CHARSETS_AVAILABLE e COMPILED_CHARSETS no configure.in.

  4. Reconfigure, recompile e teste.

Para um conjunto de caracteres complexo faça o seguinte:

  1. Crie o arquivo strings/ctype-MYSET.c na distribuição fonte do MYSQL.

  2. Adicione MYSET ao final do arquivo sql/share/charsets/Index. Associe um número único a ele.

  3. Procure por um dos arquivos ctype-*.c existentes para ver o que precisa ser definido, por exemplo strings/ctype-big5.c. Perceba que os vetores no seu arquivo deve ter nomes como ctype_MYSET, to_lower_MYSET e etc. Isto corresponde aos arrays no conjunto simples de caracteres - Seção 4.7.4, “Os Vetores de Definições de Caracteres” - para um conjunto de caracteres complexo.

  4. Próximo ao topo do arquivo, coloque um comentário especial como este:

    /*
    * This comment is parsed by configure to create ctype.c,
    * so don't change it unless you know what you are doing.
    *
    * .configure. number_MYSET=MYNUMBER
    * .configure. strxfrm_multiply_MYSET=N
    * .configure. mbmaxlen_MYSET=N
    */
    

    O programa configure utiliza este comentário para incluir o conjunto de caracteres na biblioteca MySQL automaticamente.

    As linhas strxfrm_multiply e mbmaxlen serão explicadas nas próximas seções. Só as inclua se você precisar de funções de ordenação de strings ou das funções de conjuntos de caracteres multi-byte, respectivamente.

  5. Você deve então criar algumas das seguintes funções:

    • my_strncoll_MYSET()

    • my_strcoll_MYSET()

    • my_strxfrm_MYSET()

    • my_like_range_MYSET()

    Veja mais informações sobre isto na Seção 4.7.5, “Suporte à Ordenação de Strings”.

  6. Adicione o nome do conjunto de caracteres às listas CHARSETS_AVAILABLE e COMPILED_CHARSETS no configure.in.

  7. Reconfigure, recompile e teste.

O arquivo sql/share/charsets/README fornece algumas instruções a mais.

Se você desejar ter o seu conjunto de caracteres incluído na distribuição MySQL, envie um email com um patch para a lista de email ``internals'' do MySQL. Veja mais informações sobre isto na Seção 1.7.1.1, “As Listas de Discussão do MySQL”.

4.7.4. Os Vetores de Definições de Caracteres

to_lower[] e to_upper[] são vetores simples que definemm os caracteres minúsculos e maísculos correspondentes a cada membro do conjunto de caracteres. Por exemplo:

to_lower['A'] deve conter 'a'
to_upper['a'] deve conter 'A'

sort_order[] é um mapa indicando como os caracteres devem ser ordenados para propósitos de comparação e ordenação. Para vários conjuntos de caracteres, isto é o mesmo que to_upper[] (que significa ordenar em caso insensitivo). O MySQL ordenará caracteres baseado no valor de sort_order[caractere]. Para regras mais complicadas de ordenação, veja a discussão sobre ordenação de string abaixo. Veja mais informações sobre isto na Seção 4.7.5, “Suporte à Ordenação de Strings”.

ctype[] é um vetor com valores binários, com um elemento para cada caracter. (Note que to_lower[], to_upper[] e sort_order[] são indexados pelo valor do caracter, mas o ctype[] é indexado pelo valor do caracter + 1. Este é um antigo legado para tratamento de EOF.)

Pode-se encontrar as seguintes máscaras binárias de definições em m_ctype.h:

#define _U 01 /* Maísculo */
#define _L 02 /* Minúsculo */
#define _N 04 /* Numeral (digito) */
#define _S 010 /* Caractere de espaço */
#define _P 020 /* Pontuação */
#define _C 040 /* Caractere de controle */
#define _B 0100 /* Branco */
#define _X 0200 /* Digito heXadecimal */

A entrada ctype[] para cada caracter deve ser a união dos valores da máscara binária que descrevem o caracter. Por exemplo, 'A' é um caracter maiúsculo (_U) bem como um dígito hexadecimal (_X), portanto ctype['A'+1] deve conter o valor:

_U + _X = 01 + 0200 = 0201

4.7.5. Suporte à Ordenação de Strings

Se as regras de ordenação para a sua linguagem forem muito complexas para serem tratadas com uma simples tabela sort_order[], será necessário o uso das funções de ordenação de strings.

No momento, a melhor documentação sobre isto são os conjuntos de caracteres que já estão implementados. Confira os conjuntos de caracteres big5, czech, gbk, sjis e tis160 para exemplos.

Você deve especificar o valor strxfrm_multiply_MYSET=N no comentário especial no topo do arquivo. N deve ser configurado para a razão máxima que as strings podem crescer durante my_strxfrm_MYSET (ele deve ser um inteiro positivo).

4.7.6. Suporte à Caracteres Multi-byte

Se você deseja adicionar suporte para novos conjuntos de caracteres que incluem caracteres multi-byte, você precisa usar as funções para caracteres multi-byte.

No momento, a melhor documentação sobre isto são os conjuntos de caracteres que já estão implementados. Confira os conjuntos de caracteres euc_kr, gb2312, gbk, sjis e ujis para exemplos. Eles são implementados no arquivo ctype-'conj_caracter'.c no diretório strings

Você deve especificar o valor mbmaxlen_MYSET=N no comentário especial no topo do arquivo. N deve ser configurado como o tamanho em bytes do maior caracter no conjunto.

4.7.7. Problemas com Conjuntos de Caracteres

Se você tentar usar um conjunto de caractere que não foi compilado dentro do se binário, você pode encontrar aluguns problemas:

  • Seu programa tem um caminho errado para onde o conjunto de caracter está armazenado (Padrão /usr/local/mysql/share/mysql/charsets). Isto pode ser corrigido usando a opção --character-sets-dir para o programa em questão.

  • O conjunto sde caracteres é multi-byte e não pode ser carregado dinamicamente. Neste caso você tem que recompilar o programa com o suporte para o conjunto de caracteres.

  • O conjunto de caracteres é dinâmica, mas você não tem um arquivo de configuração para ele. Neste caso você deve instalar o arquivo configure para o conjunto de caracteres de uma nova distriibuição do MySQL.

  • Seu arquivo Index não contém o nome do conjunto de caracteres.

    ERROR 1105: File '/usr/local/share/mysql/charsets/?.conf' not found
    (Errcode: 2)
    

    Neste caso você deve obter um novo arquivo Index ou adicionar o nome do conjunto de caracters que falta manualmente.

Para tabelas MyISAM, você pode vericifcar o nome e número do conjunto de caracteres para uma tabela com myisamchk -dvv nome_tabela.