- 1 1. Introdução
- 2 2. Conceitos Básicos e Sintaxe de Expressões Regulares no MySQL
- 3 Resumo
- 4 3. Funções de Expressão Regular Adicionadas no MySQL 8.0 e Posteriores
- 5 4. Exemplos Práticos de Expressões Regulares MySQL
- 5.1 4.1 Validação de Endereço de Email
- 5.2 4.2 Verificando Formatos de Números de Telefone Japoneses
- 5.3 4.3 Validação de Formato de Número de Cartão de Crédito
- 5.4 4.4 Removendo Tags HTML
- 5.5 4.5 Validação de Formato de CEP (Japão)
- 5.6 4.6 Filtragem de Nome de Usuário (Detectando Palavras Não Permitidas)
- 6 Resumo
- 7 5. Considerações Importantes ao Usar Expressões Regulares (Desempenho e Segurança)
- 8 Resumo
- 9 6. FAQ (Perguntas Frequentes)
- 9.1 6.1 Quais padrões de regex posso usar no MySQL?
- 9.2 6.2 Qual é a diferença entre LIKE e REGEXP?
- 9.3 6.3 Quais são as diferenças nas funcionalidades de regex entre MySQL 5.x e MySQL 8.x?
- 9.4 6.4 O que devo fazer se uma regex não funcionar como esperado?
- 9.5 6.5 Como posso melhorar o desempenho de consultas REGEXP?
- 10 Resumo
- 11 7. Resumo
1. Introdução
Usando Expressões Regulares no MySQL
MySQL é um poderoso sistema de gerenciamento de banco de dados para busca e manipulação de dados, e também oferece suporte a expressões regulares (REGEXP) para permitir buscas mais flexíveis. Com expressões regulares, você pode extrair eficientemente dados que correspondam a padrões específicos, bem como formatar ou validar dados.
Benefícios de Usar Expressões Regulares no MySQL
Usar expressões regulares no MySQL traz benefícios como:
- Busca avançada : Extraia facilmente dados que contenham strings ou padrões específicos.
- Verificação de integridade dos dados : Útil para validação de entrada (por exemplo, validar formatos de endereços de e‑mail).
- Mais poderoso que o operador LIKE : Ao contrário do LIKE, que usa curingas (
%e_), o REGEXP permite definir condições de busca complexas de forma mais flexível.
Propósito e Estrutura deste Artigo
Este artigo explica tudo, desde os conceitos básicos de expressões regulares no MySQL até o uso avançado, otimização de desempenho e as novas funções de expressão regular introduzidas no MySQL 8.0 e versões posteriores. Com exemplos práticos, o conteúdo foi projetado para ser fácil de entender, mesmo para iniciantes.
Estrutura do artigo:
- Conceitos básicos e sintaxe de expressões regulares no MySQL
- Funções de expressão regular adicionadas no MySQL 8.0 e posteriores
- Exemplos práticos (validação, extração de dados, conversão de formato)
- Considerações importantes ao usar expressões regulares (desempenho, segurança)
- FAQ (Perguntas Frequentes)
- Resumo
2. Conceitos Básicos e Sintaxe de Expressões Regulares no MySQL
Como Usar Expressões Regulares no MySQL
No MySQL, você usa o operador REGEXP (ou RLIKE) para trabalhar com expressões regulares. Semelhante ao operador LIKE, ele serve para determinar se o valor de uma coluna corresponde a um padrão regex especificado.
Sintaxe básica
SELECT * FROM table_name WHERE column_name REGEXP 'regex_pattern';
Ou
SELECT * FROM table_name WHERE column_name RLIKE 'regex_pattern';
RLIKE é um alias para REGEXP, e ambos se comportam da mesma forma.
Exemplo
Por exemplo, para buscar registros onde o nome contém o caractere “山”:
SELECT * FROM users WHERE name REGEXP '山';
Padrões Básicos de Expressões Regulares
Nas expressões regulares do MySQL, você pode usar padrões como os seguintes.
| Symbol | Meaning | Example | Result |
|---|---|---|---|
. | Any single character | a.c | Matches “abc”, “aac”, “adc” |
^ | Start of the string | ^abc | Matches “abcde” but not “dabc” |
$ | End of the string | xyz$ | Matches “axyz” but not “xyzb” |
[] | Any one of the specified characters | [abc] | Matches “a”, “b”, or “c” |
[^] | Any character not in the specified set | [^abc] | Matches any character except “a”, “b”, or “c” |
* | Repeat the preceding character 0 or more times | a* | Matches “”, “a”, “aa”, “aaa”, etc. |
+ | Repeat the preceding character 1 or more times | a+ | Matches “a”, “aa”, “aaa”, etc. (does not match the empty string) |
{n} | Repeat the preceding character exactly n times | a{3} | Matches “aaa” |
{n,} | Repeat the preceding character at least n times | a{2,} | Matches “aa”, “aaa”, “aaaa”, etc. |
{n,m} | Repeat the preceding character between n and m times | a{2,4} | Matches “aa”, “aaa”, “aaaa” |
Diferenças em relação ao Operador LIKE
O MySQL também fornece o operador LIKE, que é comumente usado para correspondência de padrões simples. Contudo, o REGEXP é mais poderoso que o LIKE e suporta buscas com condições mais complexas.
Exemplo 1: Usando o operador LIKE
SELECT * FROM users WHERE name LIKE '%山%';
- Com
LIKE, você pode buscar dados que contenham山, mas só pode usar curingas simples (%e_).
Exemplo 2: Usando o operador REGEXP
SELECT * FROM users WHERE name REGEXP '^山';
- Com
REGEXP, você pode extrair apenas os dados onde o nome começa com 山.
Como Especificar Múltiplos Padrões
Você pode usar | para especificar vários padrões com uma condição OR.
Exemplo: Obter usuários cujo sobrenome seja “佐藤” ou “田中”
SELECT * FROM users WHERE name REGEXP '佐藤|田中';
Correspondência Negativa
Se você usar ^ dentro de colchetes, pode recuperar dados que “não contêm os caracteres especificados”.
Exemplo: Dados que começam com um caractere diferente de “山”
SELECT * FROM users WHERE name REGEXP '^[^山]';
Neste caso, ele retorna registros onde o nome não começa com 山.
Resumo
- No MySQL,
REGEXPpermite buscas de padrões mais poderosas do queLIKE. - Compreender a sintaxe básica e padrões (
.,^,$,[],*,+, etc.) permite buscas flexíveis. - É importante entender as diferenças em relação ao
LIKEe usar cada um de forma apropriada. - Usar
|permite buscar com múltiplos padrões. - Usar classes de caracteres negativos
[^ ]ajuda a buscar dados que não começam com caracteres específicos.
3. Funções de Expressão Regular Adicionadas no MySQL 8.0 e Posteriores
No MySQL 8.0, além do operador tradicional REGEXP, quatro novas funções foram adicionadas para permitir buscas de expressões regulares mais flexíveis. Elas tornam possível recuperar posições de correspondência, extrair subcadeias e realizar substituições, expandindo grandemente o que você pode fazer com regex no MySQL.
Nesta seção, explicamos cada nova função de expressão regular em detalhes e mostramos exemplos concretos.
3.1 REGEXP_LIKE()
Visão Geral
REGEXP_LIKE(), assim como o operador REGEXP, verifica se um valor de coluna corresponde a um padrão de regex especificado.
Sintaxe
REGEXP_LIKE(column_name, 'regex_pattern' [, flags])
column_name: a coluna a ser pesquisada'regex_pattern': o padrão de regex usado como a condiçãoflags (optional): sensibilidade a maiúsculas/minúsculas (useipara correspondência sem distinção de maiúsculas/minúsculas)
Exemplos
“Obter usuários cujo email termina com gmail.com ou yahoo.co.jp”
SELECT * FROM users WHERE REGEXP_LIKE(email, '(@gmail\.com|@yahoo\.co\.jp)$');
“Buscar nomes de usuário contendo ‘admin’ (sem distinção de maiúsculas/minúsculas)”
SELECT * FROM users WHERE REGEXP_LIKE(username, 'admin', 'i');
✅ REGEXP_LIKE() serve o mesmo propósito que o operador REGEXP, mas permite um estilo mais amigável ao SQL padrão.
3.2 REGEXP_INSTR()
Visão Geral
REGEXP_INSTR() retorna a posição (índice inicial) onde ocorre uma correspondência de regex dentro de uma string.
Sintaxe
REGEXP_INSTR(column_name, 'regex_pattern' [, start_position, occurrence, return_option, flags])
start_position(optional): onde começar a busca (padrão: 1)occurrence(optional): qual ocorrência de correspondência retornar (padrão: 1)return_option(optional): 0 (retornar posição inicial) ou 1 (retornar posição final da correspondência)flags(optional): useipara correspondência sem distinção de maiúsculas/minúsculas
Exemplos
“Se o número de telefone começa com 090 ou 080, obter a posição inicial”
SELECT phone, REGEXP_INSTR(phone, '^(090|080)') AS match_pos FROM users;
“Obter a posição inicial da parte do domínio em um endereço de email”
SELECT email, REGEXP_INSTR(email, '@') AS domain_start FROM users;
- Ele retorna a posição onde
@é encontrado (ex.:user@example.comretorna5).
✅ Com REGEXP_INSTR(), você pode recuperar informações posicionais, expandindo suas opções para processamento de strings.
3.3 REGEXP_SUBSTR()
Visão Geral
REGEXP_SUBSTR() extrai a subcadeia que corresponde a um padrão de regex de dentro de uma string.
Sintaxe
REGEXP_SUBSTR(column_name, 'regex_pattern' [, start_position, occurrence, flags])
occurrence(optional): obter a enésima correspondência (padrão: 1)flags(optional): sensibilidade a maiúsculas/minúsculas (ipara ignorar maiúsculas/minúsculas)
Exemplos
“Extrair apenas a parte do domínio de um endereço de email”
SELECT email, REGEXP_SUBSTR(email, '@[a-zA-Z0-9.-]+') AS domain FROM users;
“Obter a primeira sequência de números em uma mensagem”
SELECT message, REGEXP_SUBSTR(message, '[0-9]+') AS first_number FROM logs;
✅ Com REGEXP_SUBSTR(), você pode extrair padrões específicos e usá-los para organizar e transformar dados.
3.4 REGEXP_REPLACE()
Visão Geral
REGEXP_REPLACE() substitui subcadeias que correspondem a um padrão de regex por outra string.
Sintaxe
REGEXP_REPLACE(column_name, 'regex_pattern', 'replacement' [, occurrence, flags])
replacement: a string para substituir a parte correspondidaoccurrence(opcional): substituir apenas a n‑ésima correspondência (se omitido, substitui todas as correspondências)flags(opcional): useipara correspondência sem distinção entre maiúsculas e minúsculas
Exemplos
“Remover hífens (-) de números de telefone”
SELECT phone, REGEXP_REPLACE(phone, '-', '') AS clean_phone FROM users;
“Remover tags HTML”
SELECT comment, REGEXP_REPLACE(comment, '<[^>]+>', '') AS clean_text FROM reviews;
✅ Com REGEXP_REPLACE(), a conversão de formato e a limpeza de dados se tornam fáceis.
3.5 Resumo
| Function | Purpose | Example |
|---|---|---|
REGEXP_LIKE() | Check whether a value matches a regex pattern | SELECT * FROM users WHERE REGEXP_LIKE(email, '@gmail\.com$'); |
REGEXP_INSTR() | Get the start position of the matched substring | SELECT REGEXP_INSTR(email, '@') FROM users; |
REGEXP_SUBSTR() | Extract the matched substring | SELECT REGEXP_SUBSTR(email, '@[a-zA-Z0-9.-]+') FROM users; |
REGEXP_REPLACE() | Replace the matched substring | SELECT REGEXP_REPLACE(phone, '-', '') FROM users; |
4. Exemplos Práticos de Expressões Regulares MySQL
Ao aproveitar as expressões regulares do MySQL, você pode simplificar tarefas reais de processamento de dados, como validação de dados, extração de dados específicos e conversão de formato. Nesta seção, apresentamos casos de uso práticos com código SQL e explicações.
4.1 Validação de Endereço de Email
Visão geral
Use expressões regulares para verificar se os endereços de email armazenados no banco de dados seguem um formato válido.
SQL a Usar
SELECT email FROM users
WHERE email REGEXP '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$';
Explicação
^[a-zA-Z0-9._%+-]+→ um ou mais caracteres alfanuméricos, pontos, sublinhados ou sinais de mais antes de@@[a-zA-Z0-9.-]+→ um nome de domínio após@\.[a-zA-Z]{2,}$→ termina com um TLD (Domínio de Nível Superior) de pelo menos 2 letras (ex.:.com,.jp,.net)
Com esta consulta, você pode excluir endereços de email inválidos (ex.: user@@example.com, user@.com).
4.2 Verificando Formatos de Números de Telefone Japoneses
Visão geral
Determine se números de telefone japoneses comuns (ex.: 090-1234-5678, 03-1234-5678) seguem o formato correto.
SQL a Usar
SELECT phone FROM users
WHERE phone REGEXP '^(0[789]0-[0-9]{4}-[0-9]{4}|0[1-9]-[0-9]{4}-[0-9]{4})$';
Explicação
0[789]0-[0-9]{4}-[0-9]{4}→ números móveis (090-xxxx-xxxx,080-xxxx-xxxx, etc.)0[1-9]-[0-9]{4}-[0-9]{4}→ linhas fixas (03-xxxx-xxxx,06-xxxx-xxxx, etc.)
Dessa forma, expressões regulares são úteis quando a consistência de formato é necessária.
4.3 Validação de Formato de Número de Cartão de Crédito
Visão geral
Validar os formatos de números de cartões de crédito (Visa, Mastercard, American Express, etc.).
SQL a Usar
SELECT card_number FROM payments
WHERE card_number REGEXP '^(4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13})$';
Explicação
^4[0-9]{12}(?:[0-9]{3})?$→ Visa (16 dígitos ou 13 dígitos)^5[1-5][0-9]{14}$→ Mastercard (16 dígitos)^3[47][0-9]{13}$→ American Express (15 dígitos)
Com esta consulta, você pode filtrar números de cartão inválidos no banco de dados (ex.: comprimento incorreto ou dígitos iniciais inválidos).
4.4 Removendo Tags HTML
Visão geral
Se os dados enviados pelo usuário contêm tags HTML, você pode removê-las e converter o conteúdo para texto simples.
SQL a Usar
SELECT REGEXP_REPLACE(comment, '<[^>]+>', '') AS clean_comment FROM reviews;
Explicação
'<[^>]+>'→ remove todas as tags HTML entre<e>
Exemplo
| Input | Output |
|---|---|
<b>Hello</b> World! | Hello World! |
<p>これはサンプルです</p> | これはサンプルです |
Isso é útil para remover tags HTML de comentários de usuários e postagens de blog.
4.5 Validação de Formato de CEP (Japão)
Visão geral
Validar se os códigos postais japoneses (ex.: 123-4567) seguem o formato correto.
SQL a Usar
SELECT postal_code FROM addresses
WHERE postal_code REGEXP '^[0-9]{3}-[0-9]{4}$';
Explicação
^[0-9]{3}-[0-9]{4}$→ um código postal no formato “3 dígitos-4 dígitos”
Usar esta expressão regular ajuda a manter a consistência dos dados e evitar formatos incorretos.
4.6 Filtragem de Nome de Usuário (Detectando Palavras Não Permitidas)
Visão geral
Verifique se os nomes de usuário contêm palavras não permitidas reservadas para uso do sistema (por exemplo, admin, root, system) durante o registro.
SQL para Usar
SELECT username FROM users
WHERE username REGEXP 'admin|root|system';
Explicação
admin|root|system→ detecta nomes de usuário contendo esses termos
Esta consulta ajuda a impedir que usuários regulares usem nomes destinados a administradores do sistema.
Resumo
- Expressões regulares podem ser usadas para validar endereços de email, números de telefone e números de cartão de crédito .
- Elas também podem ser aplicadas para remover tags HTML e converter formatos de dados .
- Elas são eficazes para melhorar a segurança e a consistência do banco de dados por meio de tarefas como filtrar palavras não permitidas e validar códigos postais .

5. Considerações Importantes ao Usar Expressões Regulares (Desempenho e Segurança)
Usar expressões regulares no MySQL permite buscas poderosas e limpeza de dados. No entanto, o uso inadequado pode causar degradação de desempenho e introduzir riscos de segurança. Esta seção explica considerações chave para usar expressões regulares do MySQL de forma segura e eficiente.
5.1 Otimização de Desempenho para Expressões Regulares
A busca por regex no MySQL é conveniente, mas tem uma desvantagem: os índices geralmente não se aplicam, o que pode tornar as consultas mais lentas.
Medidas para Melhorar o Desempenho
- Combine
LIKEou índicesFULLTEXTSELECT * FROM users WHERE email LIKE '%gmail.com';
- Use expressões regulares mais simples
SELECT * FROM users WHERE name REGEXP '^admin|admin$';
- Filtre os dados de destino primeiro
SELECT * FROM users WHERE email LIKE 'a%' AND email REGEXP '^[a-zA-Z0-9._%+-]+@gmail\.com$';
5.2 Riscos de Segurança e Contramedidas
1. DoS por Expressão Regular (ReDoS)
- Evite correspondências ilimitadas como
.*. - Use
^e$para limitar o escopo da busca. - Não passe entrada do usuário diretamente para
REGEXP.
2. Injeção de SQL e Expressões Regulares
❌ Consulta insegura
SELECT * FROM users WHERE username REGEXP '$input';
✅ Consulta segura (use placeholders)
$stmt = $pdo->prepare("SELECT * FROM users WHERE username REGEXP ?");
$stmt->execute([$sanitized_input]);
5.3 Compatibilidade de Versão
| Version | Main Features |
|---|---|
| MySQL 5.x | Only the REGEXP operator is available |
| MySQL 8.x | Adds REGEXP_LIKE(), REGEXP_INSTR(), REGEXP_SUBSTR(), and REGEXP_REPLACE() |
Resumo
- Como
REGEXPnão usa índices, medidas de desempenho são importantes. - Para prevenir ReDoS (DoS por Expressão Regular), evite o uso excessivo de curingas.
- Para prevenir injeção de SQL, não aplique entrada do usuário diretamente a
REGEXP.
6. FAQ (Perguntas Frequentes)
Aqui estão perguntas comuns sobre o uso de expressões regulares (REGEXP) no MySQL. Resolver essas questões ajudará você a usar regex de forma mais eficaz.
6.1 Quais padrões de regex posso usar no MySQL?
| Symbol | Description | Example | Result |
|---|---|---|---|
. | Any single character | a.c | "abc", "aac", "adc" |
^ | Start of the string | ^abc | "abcde" (does not match "dabc") |
$ | End of the string | xyz$ | "axyz" (does not match "xyzb") |
[] | Any of the specified characters | [abc] | "a", "b", "c" |
[^] | Any character not in the specified set | [^abc] | Any character except "a", "b", "c" |
* | Repeat the preceding character 0 or more times | a* | "", "a", "aa", "aaa" |
+ | Repeat the preceding character 1 or more times | a+ | "a", "aa", "aaa" (does not match "") |
6.2 Qual é a diferença entre LIKE e REGEXP?
| Comparison | LIKE | REGEXP |
|---|---|---|
| Functionality | Simple pattern matching | Searching with complex regular expressions |
| Wildcards | % (any string), _ (any single character) | .* (any string), ^, $, [a-z], etc. |
| Search speed | Fast because indexes can apply | Often slower due to full table scans |
| Use cases | Simple searches (contains, prefix matching, etc.) | Complex searches based on specific patterns |
✅ Como LIKE é mais rápido, prefira LIKE para buscas simples e use REGEXP quando a correspondência complexa for necessária.
6.3 Quais são as diferenças nas funcionalidades de regex entre MySQL 5.x e MySQL 8.x?
| Version | Main Features |
|---|---|
| MySQL 5.x | Only the REGEXP operator is available |
| MySQL 8.x | Adds REGEXP_LIKE(), REGEXP_INSTR(), REGEXP_SUBSTR(), and REGEXP_REPLACE() |
6.4 O que devo fazer se uma regex não funcionar como esperado?
✅ Lista de Verificação
- Verifique se o escaping está correto
SELECT * FROM users WHERE email REGEXP '\.com$';
- Tente a flag
icomREGEXP_LIKE()SELECT * FROM users WHERE REGEXP_LIKE(username, 'admin', 'i');
- Verifique a codificação dos dados
SHOW VARIABLES LIKE 'character_set_database';
6.5 Como posso melhorar o desempenho de consultas REGEXP?
- Pré-filtre com
LIKESELECT * FROM users WHERE email LIKE '%gmail.com' AND email REGEXP '^[a-zA-Z0-9._%+-]+@gmail\.com$';
- Use índices onde apropriado
ALTER TABLE users ADD FULLTEXT(email);
Resumo
REGEXPé mais poderoso que LIKE, mas você deve estar atento ao desempenho.- No MySQL 8.0, novas funções regex (como
REGEXP_LIKE()) foram adicionadas, permitindo um processamento mais flexível. - Para melhorar o desempenho: combine com LIKE, use índices e crie padrões regex simples.
7. Resumo
Expressões regulares MySQL (REGEXP) são altamente úteis para buscar dados, validação e conversão de formatos. Este artigo abordou os fundamentos de regex no MySQL, novos recursos adicionados no MySQL 8.0 e posteriores, exemplos práticos, considerações importantes e FAQs.
7.1 Principais Pontos
Aqui está um rápido resumo dos pontos mais importantes.
1. Conceitos Básicos de Expressões Regulares MySQL
- Usar o operador
REGEXPpermite combinações de padrões mais flexíveis queLIKE. - Padrões regex comuns
^(início),$(fim),.(qualquer caractere único),[](classe de caracteres),+(uma ou mais repetições), etc.
2. Novas Funções de Expressão Regular no MySQL 8.0+
No MySQL 8.0, essas quatro funções foram adicionadas, permitindo um processamento mais flexível:
REGEXP_LIKE(): uma alternativa ao operadorREGEXPREGEXP_INSTR(): obtém a posição inicial da substring correspondenteREGEXP_SUBSTR(): extrai a substring correspondenteREGEXP_REPLACE(): substitui substrings usando regex
3. Exemplos Práticos
- Validação de endereço de e‑mail
- Verificação de número de telefone e número de cartão de crédito
- Remoção de tags HTML
- Validação de formatos de código postal
- Detecção de palavras proibidas
- Limpeza de dados (remover espaços em branco, remover vírgulas, etc.)
4. Considerações Importantes ao Usar Expressões Regulares
- Otimização de desempenho
- Como
REGEXPnão usa índices, pode resultar em varreduras completas de tabela. - Você pode melhorar o desempenho combinando
LIKEou índicesFULLTEXT. - Medidas de segurança
- Para prevenir ReDoS (Denial of Service por Expressão Regular), evite o uso excessivo de
.*. - Para prevenir injeção de SQL, use
placeholders.
5. FAQ (Perguntas Frequentes)
- Padrões regex disponíveis no MySQL
- Diferenças entre
LIKEeREGEXP - Diferenças de recursos entre MySQL 5.x e 8.x
- Solução de problemas quando regex não se comporta como esperado
- Maneiras de melhorar o desempenho
7.2 Melhores Práticas para Usar Expressões Regulares
- Mantenha os padrões regex simples
- Exemplo: Evite o uso excessivo de
.*e utilize^(início) e$(fim).
- Combine com
LIKEouFULLTEXTquando apropriado
- Pré-filtre com
LIKE, então apliqueREGEXPpara reduzir o custo da consulta.
- Use
REGEXP_REPLACE()para limpeza de dados
- Exemplo: Remover tags HTML e normalizar espaços desnecessários.
- Aproveite o MySQL 8.0 e posteriores
- Usar novas funções como
REGEXP_LIKE()pode tornar o SQL mais legível.
- Aplique medidas de segurança de forma completa
- Não aplique a entrada do usuário diretamente ao
REGEXP(prevenção de injeção de SQL). - Use
placeholderspara consultas dinâmicas.
7.3 Recursos para Aprendizado Adicional
Aqui estão referências para ajudá-lo a aprender expressões regulares MySQL mais profundamente.
Documentação Oficial
7.4 Notas Finais
Expressões regulares MySQL podem ser usadas em muitas situações, incluindo busca de dados, limpeza e validação. Contudo, é importante usá‑las adequadamente, compreendendo as considerações de desempenho e segurança.
Esperamos que este artigo ajude você ao trabalhar com expressões regulares MySQL. Tente aplicar essas técnicas em seus projetos!


