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:
Adicione MYSET para o final do arquivo
sql/share/charsets/Index
Associe um
número único ao mesmo.
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”.
Adicione o nome do conjunto de caracteres às listas
CHARSETS_AVAILABLE
e
COMPILED_CHARSETS
no
configure.in
.
Reconfigure, recompile e teste.
Para um conjunto de caracteres complexo faça o seguinte:
Crie o arquivo strings/ctype-MYSET.c
na
distribuição fonte do MYSQL.
Adicione MYSET ao final do arquivo
sql/share/charsets/Index
. Associe um
número único a ele.
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.
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.
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”.
Adicione o nome do conjunto de caracteres às listas
CHARSETS_AVAILABLE
e
COMPILED_CHARSETS
no
configure.in
.
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
.