El idioma portugués, como lengua románica, emplea acentos diacríticos para indicar cambios en la pronunciación o calidad vocálica, aunque su ortografía no se basa en un sistema fonético. Estos signos incluyen el acento agudo (é, á, ó), circunflejo (ê, ô), grave (à) y la tilde (ã, õ), y son cruciales para diferenciar palabras, como "avô" (abuelo) y "avo" (un ave).
Métodos en SQL Server para consultas que ignoran acentos
En SQL Server, las consultas difusas pueden verse afectadas por los acentos, pero se pueden configurar para ignorarlos. Una técnica común es especificar una regla de clasificación que no distinga acentos, como Latin1_General_CI_AI.
SELECT * FROM Clientes WHERE Nombre COLLATE Latin1_General_CI_AI LIKE '%texto%';
Alternativamente, si la tabla tiene un índice de texto completo, se puede usar la función CONTAINS para una búsqueda más inteligente.
SELECT * FROM Articulos WHERE CONTAINS(Descripcion, '"texto"');
Estas técnicas pueden influir en el rendimiento, por lo que se recomienda evaluar su impacto en entornos con grandes volúmenes de datos.
Procesamiento en .NET sin cambios en la base de datos
Para soportar consultas difusas sin acentos desde aplicaciones .NET, se puede preprocesar la cadena de entrada eliminando los diacríticos. A continuación, se muestra un ejemplo en C# que utiliza la normalización Unicode.
using System;
using System.Globalization;
using System.Text;
public static class NormalizadorTexto
{
public static string RemoverSignosAcentuados(string texto)
{
string cadenaNormalizada = texto.Normalize(NormalizationForm.FormD);
var sb = new StringBuilder();
foreach (char c in cadenaNormalizada)
{
if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
{
sb.Append(c);
}
}
return sb.ToString().Normalize(NormalizationForm.FormC);
}
}
// Uso: entrada del usuario "cação" se convierte en "cao"
string input = "cação";
string terminoLimpio = NormalizadorTexto.RemoverSignosAcentuados(input);
// Construcción de consulta parametrizada para evitar inyección SQL
string sql = "SELECT * FROM Productos WHERE Nombre LIKE @param";
using (var conn = new SqlConnection(connectionString))
{
var cmd = new SqlCommand(sql, conn);
cmd.Parameters.AddWithValue("@param", $"%{terminoLimpio}%");
// Ejecución de la consulta...
}
Este método descompone cada carácter en su forma base y marcas no espaciadoras, filtrando solo los caracteres base para producir una versión sin acentos.
Coincidencia cuando la entrada no tiene acentos
Si el usuario ingresa texto sin acentos (por ejemplo, "cao") y se desea recuperar regsitros con acentos (como "cação"), se puede emplear la cláusula COLLATE en la consulta SQL para ignorar diferencias.
string busqueda = "cao";
string consulta = "SELECT * FROM Libros WHERE Titulo COLLATE Latin1_General_CI_AI LIKE @search";
using (var command = new SqlCommand(consulta, connection))
{
command.Parameters.Add("@search", SqlDbType.NVarChar).Value = $"%{busqueda}%";
// Ejecución y lectura de datos...
}
La regla de clasificación Latin1_General_CI_AI asegura que la búsqueda no distinga entre mayúsculas y minúsculas, ni entre caracteres acentuados y no acentuados.