MySQL e funções de caracteres (strings)

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).

15 comentários em “MySQL e funções de caracteres (strings)”

  1. Ótimo post!
    Bem legal, a gente trabalha o tempo todo com isso mas as vezes bate um branco! entrei aqui procurando uma versão do str_pad do PHP(no mysql lpad, me refrescou a memoria! ) e acabei aprendendo sobre o char_length que embora nunca tenha passado por nenhum problema sobre isso, se um dia pintar ja sei como resolver!!
    tks!

  2. como faço para fazer uma consulto e retornar um numero x de caracteres, como por exemplo, eu tenho um noticia, mas não quero exibir ela toda no resultado da consulta, so uma parte dela, uns 30 caracteres, tem alguma função para isso?

  3. mysql> SELECT UCASE(‘corinthians’);
    SÃO PAULO FUTEBOL CLUBE => está foi a melhor de todas…

  4. Gostei muito do post!

    Gostaria de saber se vc poderia me dá uma força.
    tenho 2 campos de de data um dataInicial e outro DataFinal porem no banco está como varchar a data como faria para pegar um intervalo das datas de forma correta já que o campo de data está como varchar.

    1. coleque data como datetime em vez de varchar e compare as 2 normalmente

      Excelente posr em alexandremalmeida, parabéns!

  5. Muito bom o post.
    Mas tenho uma dúvida. Tenho registros assim 01/001, 01-1/001, 15-2/099, onde o que vem antes da barra (ex: 01) é uma informação. Como faço para selecionar somente o que vem antes da barra?

  6. TOP demais! Parabéns pelo POST e pela didática! Exemplos muito claros! Grande abraço!

Deixe um comentário para Leandro Araujo Cancelar resposta

O seu endereço de e-mail não será publicado.

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.