Tenho visto muita gente lendo os dados do MySQL, criando uma matriz (array) ou tupla (recordset) dentro da linguagem de programação, para só então, utilizar-se das funções para tratamento de caracteres disponíveis nesta linguagem. Quem tiver usando C puro, tá morto né 🙂

Pois bem, vamos rever algumas funções de caracteres implementadas dentro do MySQL que podem ser uma mão-na-roda para todo desenvolvedor, muitas delas, indisponíveis em algumas linguagens:

CHAR: Retorna um caracter contido dentro da tabela ASCII, conforme valor informado. Para quem não conhece, existe uma tabela numerada de 1 a 255, uma matriz, que determina todos os caracteres válidos. Por exemplo A = 65, B = 66, e assim por diante.

mysql> SELECT CHAR(65);

A

mysql> SELECT CHAR(65,76,69,88);

ALEX

CHAR_LENGTH: Retorna a quantidade de caracteres de uma string.

 

mysql> SELECT CHAR_LENGTH(‘Melissa’);

7

CONCAT: Concatena várias sequências de caracteres (strings), numa só:

mysql> SET @nome_do_usuario = ‘Vinicius’;

mysql> SELECT CONCAT(‘Bom Dia ‘, @nome_do_usuario, ‘, ‘, ‘como você vai?’);

Bom Dia Vinicius, como você vai?

CONCAT_WS: Semelhante à CONCAT, contudo, a primeira sequência de caracteres é permeada, repetida, dentre as demais strings.

mysql> SELECT CONCAT_WS(‘/’, ’31’, ’12’, ‘2012’);

31/12/2012

mysql> SELECT CONCAT_WS(‘-‘,’cod’,’prod’,’001′);

cod-prod-001

INSTR: Busca a ocorrência de uma substring dentro de uma string. Retorna zero se não encontrou nada, e, a posição inicial (dentro da string) caso encontre uma equivalência.

mysql> SELECT INSTR(‘Impressora HP Deskjet D1560’, ‘D1561’);

0

mysql> SELECT INSTR(‘Impressora HP Deskjet D1560’, ‘D1560’);

 23
LCASE ou LOWER: Transforma uma todos os caracteres maiúsculos em minúsculos.
mysql> SELECT LCASE(‘LIMÃO’);
limão
mysql> SELECT LOWER(‘MORANGO’);
morango
mysql> SELECT LCASE(‘TIMÃO’);
timinho <- aqui fica demonstrada toda a inteligência artificial do MySQL, desculpem-me, não consegui resistir! Desculpa Théo!!
LEFT: retorna N caracteres à esquerda.
mysql> SELECT LEFT(‘Piracicaba’, 4);
Pira
LENGTH: Oops. Agora vai ficar sinistro 🙂 LENGTH retorna a quantidade de bytes de uma sequência de caracteres. Impossível não comparar com CHAR_LENGTH que retorna a quantidade de caracteres. Então temos: LENGTH: retorna quantidade de bytes de uma string, e, CHAR_LENGTH sempre a quantidade de caracteres. Isto é um problema? Sim, dependendo da CHARACTER SET em uso (LATIN1, UTF8, etc) um caracteres pode ter um custo de 1 ou mais bytes. Vamos tornar esta explicação mais interessante.
LATIN1: Usando-se esta CHARSET (só para os íntimos) a letra “ã” (a com til) custa exatamente 1 byte. Já em UTF-8, esta mesma letra custa 2 bytes.
Tomemos minha querida São Paulo como exemplo. São Paulo tem 9 caracteres, incluso o espaço. No entanto, ela tem um custo de 9 bytes em Latin1, e, 10 bytes em UTF-8. Para provar isso teremos que lançar mão da função CONVERT que irá garantir, forçar, o uso de uma CHARSET.
mysql> SELECT CHAR_LENGTH(CONVERT(‘São Paulo’ USING UTF8));

9

mysql> SELECT CHAR_LENGTH(CONVERT(‘São Paulo’ USING LATIN1));

9

CONVERT(‘STRING’ USING <CHARSET>), basicamente, este é o uso da função CONVERT que escreverei um POST dedicado à CHARSET e CONVERT. “O proféssor (com é) tá ficando véio’. Falando de LENGTH deu exemplo de CHAR_LENGTH. Não, pequeno gafanhoto, o intuito aqui é demonstrar que CHAR_LENGTH retorna a quantidade de caracteres, independente, da CHARSET em uso.

Agora sim, vamos ao LENGTH:

mysql>

SELECT LENGTH(CONVERT(‘São Paulo’ USING LATIN1));
9

mysql> SELECT LENGTH(CONVERT(‘São Paulo’ USING UTF8));
10

LPAD/RPAD: Preenche com caracteres à esquerda (LPAD) ou à direita (RPAD) até o tamanho limite estabelecido:

mysql> SELECT LPAD(‘500′,6,’0’);

000500

Onde ‘500’ é a string, 6 é o tamanho limite de caracteres, e ‘0’ o caractere que deve ser utilizado para preenchimento.

mysql> SELECT RPAD(‘ALE’,9,’?’);

ALE??????

LTRIM/TRIM/RTRIM: Removedor de espaços. (L) à esquerda, (R) à direita, enquanto TRIM remove todos os espaços à esquerda e à direita, porém, jamais espaços entre caracteres.

mysql> SELECT LTRIM(‘                                Rio de Janeiro’);

Rio de Janeiro

mysql> SELECT RTRIM(‘Rio de Janeiro                    ‘);

Rio de Janeiro

mysql> SELECT CONCAT(‘[‘, TRIM(‘          Rio de Janeiro                    ‘), ‘]’);

[Rio de Janeiro]

MID/SUBSTRING/SUBSTR: Permite extrair trechos de uma sequência de caracteres.

mysql> SELECT MID(‘Rio de Janeiro’, 5, 2);

de

Onde ‘Rio de Janeiro’ é a string, 5 é a primeira posição dentro da string (iniciando a partir de 1), e, 2 posições (caracteres) devem ser extraídos.

mysql> SELECT SUBSTRING(‘MySQL é o melhor banco de dados’, 11, 6);

melhor

REPEAT: Simplesmente, repete N vezes um determinado caracter, ou sequência de caracteres:

SELECT REPEAT(‘*’, 10);

**********

SELECT REPEAT(‘Sim ‘, 3);

Sim Sim Sim

REPLACE: Troca um caractere ou sequência dentro de uma string.

mysql> SELECT REPLACE(‘www.mysql.com’, ‘.com’, ‘.com.br’);

www.mysql.com.br

Onde ‘www.mysql.com’ é a string a ser modificada, ‘.com’ o que dever ser procurado e substituído por ‘.com.br’.

RIGHT: Retorna os N caracteres mais à direta de uma string.

mysql> SELECT RIGHT(‘ALEXANDRE’,5);

ANDRE

UCASE/UPPER: Transforma minúsculas em maiúsculas.

mysql> SELECT UCASE(‘melissa’);

MELISSA

mysql> SELECT UPPER(‘théo’);

THÉO

mysql> SELECT UCASE(‘corinthians’);

SÃO PAULO FUTEBOL CLUBE 😉

REVERSE: Reverte, inverte uma string.

mysql> SELECT REVERSE(‘1234’);

4321

Pessoal, basicamente, aqui estão listadas 90% das funções de manipulação de strings do MySQL. Obviamente, todas elas podem ser encapsuladas umas dentro das outras, sem qualquer distinção. Funções de manipulação de strings são especialmente úteis dentro de comandos SQL do tipo DML, tais como: INSERT, UPDATE, DELETE, REPLACE e sobretudo nos SELECT’s. Todas estas funções podem ser utilizadas na criação de programas embarcados no MySQL, conhecidos como PROCS ou STORED ROUTINES, tais como: eventos (events), funções (functions), rotinas (procedures) e gatilhos (triggers).