Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Mauricio Delajustine

Busca com acento ou sem acento

Recommended Posts

Boa noite,

 

preciso que meu select me retorne o resultado de quantas SCÉNIC estiverem cadastradas, mas o problema é quando a busca

for SCENIC sem acento, preciso que retorne o mesmo resultado com a palavra com ou sem acento.

 

procurando pela net achei isso ai , mas não está funcionando

SELECT *  FROM `tabela` WHERE `campo` LIKE _utf8 '%SCÉNIC%' COLLATE utf8_general_ci;

 

Desde já agradeço, abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

teste simples, retornou corretamente..

 

CREATE TABLE `latin` (
 `id` int(3) NOT NULL AUTO_INCREMENT,
 `w` varchar(50) COLLATE latin1_general_ci NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci

 

INSERT INTO latin VALUES (1,'SCÉNIC');

 

SELECT *  FROM `latin` WHERE `w` LIKE _utf8 '%CEN%' COLLATE utf8_general_ci;

SELECT *  FROM `latin` WHERE `w` LIKE _utf8 '%CÉN%' COLLATE utf8_general_ci;

retorna 1 SCÉNIC para ambos

 

SELECT *  FROM `latin` WHERE `w` LIKE '%CEN%';

retorna nulo

 

 

se puder, poste o DDL da sua tabela (estrutura)

 

lembre-se de que no mysql é possível definir um charset para um determinado row independente do tipo setado para a tabela.

Compartilhar este post


Link para o post
Compartilhar em outros sites

CREATE TABLE IF NOT EXISTS `veiculos` (
 `id_veiculo` int(150) NOT NULL AUTO_INCREMENT,
 `id_cliente` int(20) NOT NULL,
 `sit_cliente` varchar(20) NOT NULL,
 `plano` varchar(10) NOT NULL,
 `tipo` varchar(20) NOT NULL,
 `subtipo` varchar(30) NOT NULL,
 `estado` varchar(10) NOT NULL,
 `ano` varchar(10) NOT NULL,
 `marca` varchar(20) NOT NULL,
 `modelo` varchar(50) NOT NULL,
 `placa` varchar(10) NOT NULL,
 `cor` varchar(20) NOT NULL,
 `combustivel` varchar(20) NOT NULL,
 `km` varchar(20) NOT NULL DEFAULT '0',
 `preco` varchar(30) NOT NULL,
 `portas` varchar(10) NOT NULL,
 `informacoes` mediumtext NOT NULL,
 `acessorios` mediumtext NOT NULL,
 `outros_acessorios` mediumtext NOT NULL,
 `capa` varchar(150) NOT NULL,
 `cidade` varchar(100) NOT NULL,
 `data` varchar(20) NOT NULL,
 PRIMARY KEY (`id_veiculo`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=871 ;

Segue a estrutura da minha tabela, notei que não existe o COLLATE=latin1_general_ci, como faço para 'editar' e corrigir este erro ?

 

O seu teste funcionou aqui normalmente....

Compartilhar este post


Link para o post
Compartilhar em outros sites

O correto seria utilizar o collation de latin_gerneral_ci. Entretanto, pode dar problemas mesmo na busca com acentos. Isso em versões novas do mysql.

 

Ao utilizar o Mysql WorkBench para modelagem, percebi que ele indica o collation latin_swedish_ci. Estranhei ele colocar como padrão esse ao invés de latin_gneral.

 

CI - Case Insentive.

 

Mas não indica nada sobre os acentos. O latin_swedish ignora acentos e trata como o "radical" da letra (á -> a, à -> a, ã -> a). Tanto faz o que se busca com acentos, sem, maiúsculo e minúsculo. Funcionou em todos os testes que eu fiz, utilizando PDO.

 

Para alterar, basta ir no phpmyadmin, e editar o campo. E alterar o collation.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Criei a tabela com esta estrutura ..

CREATE TABLE IF NOT EXISTS `veiculos2` (
 `id_veiculo` int(150) NOT NULL AUTO_INCREMENT,
 `id_cliente` int(20) NOT NULL,
 `sit_cliente` varchar(20) COLLATE latin1_general_ci NOT NULL,
 `plano` varchar(10) COLLATE latin1_general_ci NOT NULL,
 `tipo` varchar(20) COLLATE latin1_general_ci NOT NULL,
 `subtipo` varchar(30) COLLATE latin1_general_ci NOT NULL,
 `estado` varchar(10) COLLATE latin1_general_ci NOT NULL,
 `ano` varchar(10) COLLATE latin1_general_ci NOT NULL,
 `marca` varchar(20) COLLATE latin1_general_ci NOT NULL,
 `modelo` varchar(50) COLLATE latin1_general_ci NOT NULL,
 `placa` varchar(10) COLLATE latin1_general_ci NOT NULL,
 `cor` varchar(20) COLLATE latin1_general_ci NOT NULL,
 `combustivel` varchar(20) COLLATE latin1_general_ci NOT NULL,
 `km` varchar(20) COLLATE latin1_general_ci NOT NULL DEFAULT '0',
 `preco` varchar(30) COLLATE latin1_general_ci NOT NULL,
 `portas` varchar(10) COLLATE latin1_general_ci NOT NULL,
 `informacoes` mediumtext COLLATE latin1_general_ci NOT NULL,
 `acessorios` mediumtext COLLATE latin1_general_ci NOT NULL,
 `outros_acessorios` mediumtext COLLATE latin1_general_ci NOT NULL,
 `capa` varchar(150) COLLATE latin1_general_ci NOT NULL,
 `cidade` varchar(100) COLLATE latin1_general_ci NOT NULL,
 `data` varchar(20) COLLATE latin1_general_ci NOT NULL,
 PRIMARY KEY (`id_veiculo`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=871 ;

 

Pelos testes que realizei agora , se eu tiver cadastrado SCENIC ou SCÉNIC funciona corretamente, mas nos meus cadastros esta gravado " Scénic ", dai estes registros não estão retornando na pesquisa, alguém sabe uma saida para isso ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você está utilizando ajax para consulta? Dependendo da forma que você programou, vai necessitar colocar utf8_decode ou utf8_encode. Não sei dizer de cara qual resolve, teste ambas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você está utilizando ajax para consulta? Dependendo da forma que você programou, vai necessitar colocar utf8_decode ou utf8_encode. Não sei dizer de cara qual resolve, teste ambas.

 

Não estou usando ajax na consulta, você diz usar no Select o utf8_decode, e o uft8_encode ? Pois na hora de mostrar os valores ex: echo $var_da_consulta, ele mostra corretamente a acentuação, o meu problema é no Select que não retorna.

 

SELECT *  FROM `latin` WHERE `w` LIKE _utf8 '%CÉN%' COLLATE utf8_general_ci;  

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não no select em si, mas no php.

Por exemplo:

Se você recebe a consulta por get, com o nome busca. Vamos ao código:

$busca = $_GET['busca'];

 

Agora você insere a função para tratar as palavras acentuadas:

$busca = utf8_decode( $_GET['busca'] );

 

Se isso não funcionar, tu utiliza a outra função:

$busca = utf8_encode( $_GET['busca'] );

Compartilhar este post


Link para o post
Compartilhar em outros sites

fiz o teste com o seguinte codigo, o utf8_encode foi o que me retornou o resultado mas somente os resultados buscado com o acento em Scénic mas os que estão Scenic não retornaram ..

$teste_atual = utf8_encode($_GET['busca']);

$sql = "SELECT VE.*, CL.id_cliente as cliente, CL.marca as cli_marca, CL.cidade as cli_cidade FROM veiculos VE ". 
"LEFT JOIN clientes CL ON CL.id_cliente = VE.id_cliente ".
      "WHERE VE.modelo LIKE _utf8 '%".$teste_atual."%' COLLATE utf8_general_ci ";

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.