XOOPS Brasil

 

9.4. Operações Afetadas pelo Suporte a Conjunto de Caracteres

Esta seção descreve operacões que pegam a informação do conjunto de caracteres dentro da conta agora.

9.4.1. Strings de Resultados

O MySQL tem muitos operadores e funções que retornam um string. Esta seção responde a questão: Qual é o conjunto de caracteres e collation de um certa string?

Para funções simples que pegam uma string de entrada e retornam uma string de resultado como saída, a saída do conjunto de caracteres e collation são as mesmas da entrada principal. Por exemplo, UPPER(X) retorna uma string cuja string de caracter e collation são os mesmo de X. O mesmo se aplica a: INSTR(), LCASE(), LOWER(), LTRIM(), MID(), REPEAT(), REPLACE(), REVERSE(), RIGHT(), RPAD(), RTRIM(), SOUNDEX(), SUBSTRING(), TRIM(), UCASE(), UPPER(). (Note também: a função REPLACE(), diferente de todas as outras funções, ignora a collation da string de entrada e realiza uma comparação de caso-insensitivo todas as vezes.)

Para operações que combinam múltiplas entradas de string e retornam uma única saída de string, As ``regras de agregamento'' do SQL-99 se aplicam. Eles são:

  • Se ocorrer um COLLATE X explicito, então use X

  • Se ocorrerem COLLATE X e COLLATE Y explicitos, então erro

  • Senão, se todas as collations são X, então use X

  • Senão, o resultado não possui collation

Por exemplo, com CASE ... WHEN a THEN b WHEN b THEN c COLLATE X END, a collation resultante é X. O mesmo se aplica a: CONCAT(), GREATEST(), IF(), LEAST(), CASE, UNION, ||, ELT().

Para operações que convertem para dados de caracteres, o resultado do conjunto de caracteres e collation da string estão no connection/literals character set e possuem a connection/literals collation. Isto se aplica a: CHAR(), CAST(), CONV(), FORMAT(). HEX(), SPACE().

9.4.2. CONVERT()

CONVERT() fornece um modo de converter dados entre diferentes conjunto de caracteres. A sintaxe é:

CONVERT(expr USING transcoding_name)

No MySQL, nomes transcodificados são o mesmo que o nomes dos conjuntos de caracteres correspondentes.

Exemplos:

SELECT CONVERT(_latin1'Müller' USING utf8);
INSERT INTO utf8table (utf8column)
SELECT CONVERT(latin1field USING utf8) FROM latin1table;

CONVERT(... USING ...) é implementado de acordo com a especificação SQL-99.

9.4.3. CAST()

Você também pode usar CAST() para converter uma string para um conjunto de caracteres diferente. O novo formato é:

CAST ( character_string AS character_data_type
CHARACTER SET character_set_name )

Exemplo:

SELECT CAST(_latin1'test' AS CHAR CHARACTER SET utf8);

Você não usar uma cláusula COLLATE dentro de um CAST(), mas você pode usá-la fora, isto é, CAST(... COLLATE ...) é ilegal mas CAST(...) COLLATE ... é permitido.

Exemplo:

SELECT CAST(_latin1'test' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin;

Se você usar CAST() sem especificar CHARACTER SET, então o conjunto de caracteres e collation resultante são o conjunto de caracteres da conexão/literal e a sua collation padrão. Se você usar CAST() com CHARACTER SET X, então o conjunto de caracteres resultante é X e a collation resultante é a collation padrão de X.

9.4.4. SHOW CHARACTER SET

O comando SHOW CHARACTER SET mostra todos os conjunto de caracteres dsiponíveis. Ele aceita uma cláusula LIKE opcional que indica qual nome de conjunto de caracteres coincidir.

Por exemplo:

mysql> SHOW CHARACTER SET LIKE 'latin%';
+---------+-----------------------------+-------------------+--------+
| Charset | Description | Default collation | Maxlen |
+---------+-----------------------------+-------------------+--------+
| latin1 | ISO 8859-1 West European | latin1_swedish_ci | 1 |
| latin2 | ISO 8859-2 Central European | latin2_general_ci | 1 |
| latin5 | ISO 8859-9 Turkish | latin5_turkish_ci | 1 |
| latin7 | ISO 8859-13 Baltic | latin7_general_ci | 1 |
+---------+-----------------------------+-------------------+--------+
4 rows in set (0.00 sec)

Notas sobre a lista precedente:

  • A coluna Maxlen exie o número máximo de bytes usado para armazenar um caracter.

9.4.5. SHOW COLLATION

A saída de SHOW COLLATION inclui todos os conjunto de caracteres disponíveis. Ele tem uma cláusula LIKE opcional que indice com qual nome de collation que ele deve coincidir.

mysql> SHOW COLLATION LIKE 'latin1%';
+-------------------+---------+----+---------+----------+---------+
| Collation | Charset | Id | Default | Compiled | Sortlen |
+-------------------+---------+----+---------+----------+---------+
| latin1_german1_ci | latin1 | 5 | | | 0 |
| latin1_swedish_ci | latin1 | 8 | Yes | Yes | 0 |
| latin1_danish_ci | latin1 | 15 | | | 0 |
| latin1_german2_ci | latin1 | 31 | | Yes | 2 |
| latin1_bin | latin1 | 47 | | Yes | 0 |
| latin1_general_ci | latin1 | 48 | | | 0 |
| latin1_general_cs | latin1 | 49 | | | 0 |
+-------------------+---------+----+---------+----------+---------+
7 rows in set (0.00 sec)

A coluna Default indica se uma collation é o padrão para o seu conjunto de caracteres. Compiled indica se o conjunto de caracteres é ou não compilado no servidor. Sortlen é relacionado a quantidade de memória exigida para armazenar strings expressadas no conjunto de caracteres.

9.4.6. SHOW CREATE DATABASE

A consulta seguinte mostra uma instrução CREATE DATABASE que criará o banco de dados dado. O resultado inclui todas as opções de banco de dados. DEFAULT CHARACTER SET e COLLATE são suportados. Todas as opções de banco de dados são armazenadas em um arquivo texto que pode se encontrado no diretório de banco de dados.

mysql> SHOW CREATE DATABASE a;
+----------+---------------------------------------------------------------------------------+
| Database | Create Database |
+----------+---------------------------------------------------------------------------------+
| a | CREATE DATABASE `a` /*!40100 DEFAULT CHARACTER SET macce COLLATE macce_ci_ai */ |
+----------+---------------------------------------------------------------------------------+
1 row in set (0.00 sec)

9.4.7. SHOW FULL COLUMNS

A instrução SHOW COLUMNS agora mostra as collations das colunas da tabela, quando chamado como SHOW FULL COLUMNS. Colunas com tipos de dados CHAR, VARCHAR ou TEXT tem collation não-NULL. Tipos numéricos e outros que não seja caracteres tem collations NULL. Por exemplo:

mysql> SHOW FULL COLUMNS FROM a;
+-------+---------+-------------------+------+-----+---------+-------+
| Field | Type | Collation | Null | Key | Default | Extra |
+-------+---------+-------------------+------+-----+---------+-------+
| a | char(1) | latin1_swedish_ci | YES | | NULL | |
| b | int(11) | NULL | YES | | NULL | |
+-------+---------+-------------------+------+-----+---------+-------+
2 rows in set (0.02 sec)

O conjunto de caracteres não é parte do display.