Ir para conteúdo
Fórum Script Brasil
  • 0

Duvida Select


shakall

Pergunta

Galera é o seguinte, possuo um registro em minha base Mysql com o campo NM_MOTORISTA, que contém o valor "JOSÉ".

Quanto executo um sql como este por exemplo "SELECT * FROM TABELA WHERE NM_MOTORISTA='jose'

ele me retorna o registro acima, agora gostaria de saber se tem como eu especificar que "jose" é diferente de "JOSÉ" não quero que ele me traga este registro porque para mim este nome é diferten do digitado mas para o Mysql não.

Existe alguma forma de eu configurar que ele diferencia acentuacão e letras maiusculas?

Obrigado!

Link para o comentário
Compartilhar em outros sites

19 respostass a esta questão

Posts Recomendados

  • 0

Oi, 'shakall'!

Dê uma olhada na seção 3.3.4.7. Combinação de padrões do manual do MySQl versão 4.1 (tradução em português).

Procure por REGEXP e por STRCMP(expr1,expr2) (também encontrado em 6.3.2.1. Funções de Comparação de Strings)

Link para o comentário
Compartilhar em outros sites

  • 0
Oi, 'shakall'!

Dê uma olhada na seção 3.3.4.7. Combinação de padrões do manual do MySQl versão 4.1 (tradução em português).

Procure por REGEXP e por STRCMP(expr1,expr2) (também encontrado em 6.3.2.1. Funções de Comparação de Strings)

Olá Denis Obrigado pela sua ajudar, encontrei o comando que você me disse, resolveu meu problema pela metade, pois agora consigo diferenciar nomes com e sem acento, mas não consigo diferenciar nomes com letras maiusculas ou seja caso sensitivo, mesmo se eu utilizar BINARY junto com o REGEXP nada é retornado. ou seja JOSE, JOSÉ, JOSe, JOSé, nada volta se eu utilizar o BINARY, mas me ajudou bastante obrigado.

Link para o comentário
Compartilhar em outros sites

  • 0

Oi, 'shakall' !

Estive relendo o manual do MySQL na tentativa de achar uma solução para este problema. Encontrei na seção 1.8.3. Extensões do MySQL para o Padrão SQL-92 o seguinte texto:

Todas comparações de strings por padrão são caso insensitivo, com classificação ordenada determinada pelo conjunto de caracteres corrente (ISO-8859-1 Latin1 por padrão). Se você não gosta disso você deverá declarar suas colunas com o atributo BINARY ou usar o operador BINARY, que fazendo com que as comparações sejam feitas de acordo com a ordem ASCII usada na máquina servidora do MySQL
Com base no texto da seção Na seção 6.3.2.2. Caso Sensitivo que diz:
BINARY string é um atalho para CAST(string AS BINARY). See Secção 6.3.5, “Funções de Conversão”. BINARY foi introduzida na versão 3.23.0 do MySQL.

Desenvolvi e testei os selects exemplos abixo relacionados que retornaram o que você queria:

select nome from teste where cast(nome binary) = 'a'
e
select nome from teste where binary nome = 'a';

Minha base de teste tem 4 registros contendo á, a, A, Á.

Link para o comentário
Compartilhar em outros sites

  • 0

Oi 'Bruno Machado Agostinho'!

O problema deste método de pesquisa é que ele sempre fará um TABLE SCAN.

O método que mencionei acima where binary nome = 'a'; usa o índice e se ele criar a coluna com

<nome_da_coluna> BINARY varchar(<tamanho>

, então todas as pesquisas serão caso sensitivo.

Link para o comentário
Compartilhar em outros sites

  • 0
Oi 'Bruno Machado Agostinho'!

O problema deste método de pesquisa é que ele sempre fará um TABLE SCAN.

O método que mencionei acima where binary nome = 'a'; usa o índice e se ele criar a coluna com

<nome_da_coluna> BINARY varchar(<tamanho>

, então todas as pesquisas serão caso sensitivo.

Denis fiz o que você me passou mas aqui não adiantou, segue ai minha tabela e os dados que contém nela.

CREATE TABLE `INSPECAO` (

`CD_INSPECAO` int(11) NOT NULL auto_increment,

`NM_MOTORISTA` varchar(50) NOT NULL,

`NM_INSPETOR` varchar(50) default NULL,

`NM_FILIAL` varchar(50) NOT NULL,

`DS_PLACA_VEICULO` varchar(9) NOT NULL,

`DT_VISTORIA` date default NULL,

`DT_VENCIMENTO` date default NULL,

PRIMARY KEY (`CD_INSPECAO`)

) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=latin1;

INSERT INTO `INSPECAO` VALUES (10,'ROGÉRIO','JOSÉ','GASPAR','aaa-1111','2008-12-11','2008-12-11');

INSERT INTO `INSPECAO` VALUES (11,'DOUGLAS','RICARDO','LAGES','bbb-2222','2008-12-11','2008-12-11');

INSERT INTO `INSPECAO` VALUES (12,'ANDRE','SOUZA','FLORIPA','ccc-1234','2008-12-11','2008-12-11');

INSERT INTO `INSPECAO` VALUES (13,'JOAO','JOÃO','GASPAR','DDD-2222','2008-12-11','2008-12-11');

INSERT INTO `INSPECAO` VALUES (14,'PEDRO','MARCELO','GASPAR','EEE-3333','2008-12-11','2008-12-11');

INSERT INTO `INSPECAO` VALUES (15,'PAULO','CRISTIANO','FFFFF','FFF-1234','2008-12-11','2008-12-11');

INSERT INTO `INSPECAO` VALUES (16,'ANDRE','FELIPE','GASPAR','hhh-1111','2008-12-11','2008-12-11');

INSERT INTO `INSPECAO` VALUES (17,'TESTE','TESTE','TESTE','MMM-3333',NULL,NULL);

INSERT INTO `INSPECAO` VALUES (18,'ROGER','ROGERIO','GASPAR','RRR-3334',NULL,NULL);

INSERT INTO `INSPECAO` VALUES (19,'CLAUDIO','ANDRE','GASPAR','MMM-2222',NULL,NULL);

INSERT INTO `INSPECAO` VALUES (20,'FELIPE','OSCAR','GASPAR','GGG-3333',NULL,NULL);

SELECT * FROM INSPECAO WHERE BINARY NM_INSPETOR REGEXP 'JOSÉ'

Link para o comentário
Compartilhar em outros sites

  • 0
Opa!

Você pode resolver seu problema usando a função sha1()

SELECT * FROM TABELA WHERE sha1(NM_MOTORISTA)=sha1('jose')

se no banco estiver com acento o hash dos dois será diferente!

serve tanto para acentos quanto para letras maiusculas e minusculas

També não resolveu, se eu fizer

select * from inspecao where SHA1(nm_inspetor)=SHA1('JOSÉ')

nada é retornado, mas se eu fizer

select * from inspecao where nm_inspetor='JOSÉ'

o registro é retornado!

Link para o comentário
Compartilhar em outros sites

  • 0

Oi 'shakall'

Carreguei seu exemplopara minha base de teste.

A não ser que você esteja querendo outra coisa que eu ainda não entendi, o que foi pedido foi feito, sim.

veja o exemplo que você passou

INSERT INTO `INSPECAO` VALUES (10,"ROGÉRIO","JOSÉ","GASPAR","aaa-1111","2008-12-11","2008-12-11")
e que está na cláusula WHERE do select que você enviou
SELECT * FROM INSPECAO WHERE BINARY NM_INSPETOR REGEXP 'JOSÉ'

O retorno é somente a linha onde o inspetor aparece como JOSÉ (com o E maiúsculo e com acento agudo).

Para provar se estava correto acrescentei as linhas abaixo e, quando executei o mesmo select, retornou, como esperado, somente a linha que já tinha sido retornada antes (linha onde CD_INSPECAO = 10).

INSERT INTO `INSPECAO` VALUES (21,"ROGÉRIO","JOSE","GASPAR","aaa-1111","2008-12-11","2008-12-11")
INSERT INTO `INSPECAO` VALUES (22,"ROGÉRIO","jose","GASPAR","aaa-1111","2008-12-11","2008-12-11")
INSERT INTO `INSPECAO` VALUES (23,"ROGÉRIO","josé","GASPAR","aaa-1111","2008-12-11","2008-12-11")

Há algo não explicado?

Link para o comentário
Compartilhar em outros sites

  • 0
Oi 'shakall'

Carreguei seu exemplopara minha base de teste.

A não ser que você esteja querendo outra coisa que eu ainda não entendi, o que foi pedido foi feito, sim.

veja o exemplo que você passou

INSERT INTO `INSPECAO` VALUES (10,"ROGÉRIO","JOSÉ","GASPAR","aaa-1111","2008-12-11","2008-12-11")
e que está na cláusula WHERE do select que você enviou
SELECT * FROM INSPECAO WHERE BINARY NM_INSPETOR REGEXP 'JOSÉ'
O retorno é somente a linha onde o inspetor aparece como JOSÉ (com o E maiúsculo e com acento agudo).

Para provar se estava correto acrescentei as linhas abaixo e, quando executei o mesmo select, retornou, como esperado, somente a linha que já tinha sido retornada antes (linha onde CD_INSPECAO = 10).

INSERT INTO `INSPECAO` VALUES (21,"ROGÉRIO","JOSE","GASPAR","aaa-1111","2008-12-11","2008-12-11")
INSERT INTO `INSPECAO` VALUES (22,"ROGÉRIO","jose","GASPAR","aaa-1111","2008-12-11","2008-12-11")
INSERT INTO `INSPECAO` VALUES (23,"ROGÉRIO","josé","GASPAR","aaa-1111","2008-12-11","2008-12-11")

Há algo não explicado?

Estranho Denis porque aqui se eu executar SELECT * FROM INSPECAO WHERE BINARY NM_INSPETOR REGEXP 'JOSÉ', nada é retornadado para mim, não sei o que esta ocorrendo.

Link para o comentário
Compartilhar em outros sites

  • 0
mesma coisa se eu utilizo BINARY nada é retornado independente do que eu colocar pra ele pesquisar, fods

Altere o tipo do campo na tabela para <nomedocampo> varchar(<tamanho>) binary.

MAS, ATENÇÃO:

FAÇA BACKUP ANTES OU FAÇA EM UMA TABELA DE TESTES.

NÃO ME RESPONSABILIZO POR DANOS EM SEUS DADOS.

Faça como o exemplo abaixo:

alter table INSPECAO
modify NM_INSPETOR varchar(50) binary;

Depois disso, toda pesquisa neste campo já será caso sentitivo e diferenciará acentos. Não haverá mais a necessidade de usar as cláusulas BINARY ou REGEXP.

Link para o comentário
Compartilhar em outros sites

  • 0
HAUAU FIZ ISSO AI MAS OS NOMES FICARÃO DOIDOS JOSÉ PASSOU PRA JOSÉ

Você está usando o charset=latinl, tanto tara a tabela quanto para o atributo?

Link para o comentário
Compartilhar em outros sites

  • 0
Sim, teria que mudar o tipo do encode?

Não. Este tipo de encode é o padrão do MySQL.

Não consigo pensar em nenhuma outra solução para este problema, pois os testes em minha máquina funcionam perfeitamente.

Só te resta a opção do Bruno Machado no post #7 deste tópico.

Se você seguir a opção dele e tiver problemas de performance, crie um campo varchar de 42 posições e grave o resultado de SHA1(<campo>) nele e crie um índice. sua pesquisa se dará pos este novo campo comparando com o SHA1('jose'), por exemplo.

Mais uma coisa. Qual a versão do seu banco MySQL?

Link para o comentário
Compartilhar em outros sites

  • 0
Sim, teria que mudar o tipo do encode?

Não. Este tipo de encode é o padrão do MySQL.

Não consigo pensar em nenhuma outra solução para este problema, pois os testes em minha máquina funcionam perfeitamente.

Só te resta a opção do Bruno Machado no post #7 deste tópico.

Se você seguir a opção dele e tiver problemas de performance, crie um campo varchar de 42 posições e grave o resultado de SHA1(<campo>) nele e crie um índice. sua pesquisa se dará pos este novo campo comparando com o SHA1('jose'), por exemplo.

Mais uma coisa. Qual a versão do seu banco MySQL?

5.0

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...