Ir para conteúdo

POWERED BY:

Arquivado

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

junaooaks

[Resolvido] Case Insensitive

Recommended Posts

pessoal to precisando de uma consulta que nao diferencie maiusculo com minusculo ou acentos

 

se fizer uma perquisa com Maria

eu quero que retorne todas

maria

Maria

MARIA

 

indiferente de maiusculo ou minusculo

 

li que ate a versao 4.0 nao tinha este problema

poderia me mostrar.

 

SELECT * FROM tabela WHERE campo = maria

Compartilhar este post


Link para o post
Compartilhar em outros sites

com o uso do like ja resolve isso

Compartilhar este post


Link para o post
Compartilhar em outros sites

verifique qual collation e charset está usando

 

os collations com final "_cs" e "_ci"

 

deve estar com "_ci" (Case Insensitive)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos à lição: http://forum.imasters.com.br/public/style_emoticons/default/graduated.gif

 

mysql> CREATE TABLE nomes (
	->  id int unsigned not null auto_increment primary key,
	->  nome char(80) not null collate latin1_bin
	-> );
Query OK, 0 rows affected (0.05 sec)

mysql> INSERT INTO nomes SET nome ='Maria';
Query OK, 1 row affected (0.02 sec)

mysql> INSERT INTO nomes SET nome ='maria';
Query OK, 1 row affected (0.09 sec)

mysql> SELECT id, nome FROM nomes WHERE nome ='maria';
+----+-------+
| id | nome  |
+----+-------+
|  2 | maria |
+----+-------+
1 row in set (0.00 sec)

mysql> SELECT id, nome FROM nomes WHERE nome ='Maria';
+----+-------+
| id | nome  |
+----+-------+
|  1 | Maria |
+----+-------+
1 row in set (0.00 sec)

Como o CHARACTER SET, ou conjunto de caracteres latin1 não tem a variação cs para tornar as informações de tabelas CASE SENSITIVE...

 

mysql> SHOW CHARACTER SET LIKE 'latin%';
+---------+-----------------------------+-------------------+--------+
| Charset | Description				 | Default collation | Maxlen |
+---------+-----------------------------+-------------------+--------+
| latin1  | cp1252 West European		| latin1_swedish_ci |	  1 |
| latin2  | ISO 8859-2 Central European | latin2_general_ci |	  1 |
| latin5  | ISO 8859-9 Turkish		  | latin5_turkish_ci |	  1 |
| latin7  | ISO 8859-13 Baltic		  | latin7_general_ci |	  1 |
+---------+-----------------------------+-------------------+--------+
4 rows in set (0.00 sec)

...teremos que utilizar o COLLATE do conjunto de caracteres para tornar a coluna latin1_bin:

 

mysql> SHOW COLLATION LIKE 'latin1_bin';
+------------+---------+----+---------+----------+---------+
| Collation  | Charset | Id | Default | Compiled | Sortlen |
+------------+---------+----+---------+----------+---------+
| latin1_bin | latin1  | 47 |		 | Yes	  |	   1 |
+------------+---------+----+---------+----------+---------+
1 row in set (0.00 sec)

Interessante saber que, mesmo tornando o conteúdo da coluna binário, seus valores ainda são dependentes do conjunto de caracteres que ainda faz as comparações caracter a caracter, e não byte-a-byte, como em tipos de dados binários (BINARY, VARBINARY e BLOB).

 

Happy MySQL'ing!! http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos à lição: http://forum.imasters.com.br/public/style_emoticons/default/graduated.gif

 

mysql> CREATE TABLE nomes (
	->  id int unsigned not null auto_increment primary key,
	->  nome char(80) not null collate latin1_bin
	-> );
Query OK, 0 rows affected (0.05 sec)

mysql> INSERT INTO nomes SET nome ='Maria';
Query OK, 1 row affected (0.02 sec)

mysql> INSERT INTO nomes SET nome ='maria';
Query OK, 1 row affected (0.09 sec)

mysql> SELECT id, nome FROM nomes WHERE nome ='maria';
+----+-------+
| id | nome  |
+----+-------+
|  2 | maria |
+----+-------+
1 row in set (0.00 sec)

mysql> SELECT id, nome FROM nomes WHERE nome ='Maria';
+----+-------+
| id | nome  |
+----+-------+
|  1 | Maria |
+----+-------+
1 row in set (0.00 sec)

Como o CHARACTER SET, ou conjunto de caracteres latin1 não tem a variação cs para tornar as informações de tabelas CASE SENSITIVE...

 

mysql> SHOW CHARACTER SET LIKE 'latin%';
+---------+-----------------------------+-------------------+--------+
| Charset | Description				 | Default collation | Maxlen |
+---------+-----------------------------+-------------------+--------+
| latin1  | cp1252 West European		| latin1_swedish_ci |	  1 |
| latin2  | ISO 8859-2 Central European | latin2_general_ci |	  1 |
| latin5  | ISO 8859-9 Turkish		  | latin5_turkish_ci |	  1 |
| latin7  | ISO 8859-13 Baltic		  | latin7_general_ci |	  1 |
+---------+-----------------------------+-------------------+--------+
4 rows in set (0.00 sec)

...teremos que utilizar o COLLATE do conjunto de caracteres para tornar a coluna latin1_bin:

 

mysql> SHOW COLLATION LIKE 'latin1_bin';
+------------+---------+----+---------+----------+---------+
| Collation  | Charset | Id | Default | Compiled | Sortlen |
+------------+---------+----+---------+----------+---------+
| latin1_bin | latin1  | 47 |		 | Yes	  |	   1 |
+------------+---------+----+---------+----------+---------+
1 row in set (0.00 sec)

Interessante saber que, mesmo tornando o conteúdo da coluna binário, seus valores ainda são dependentes do conjunto de caracteres que ainda faz as comparações caracter a caracter, e não byte-a-byte, como em tipos de dados binários (BINARY, VARBINARY e BLOB).

 

Happy MySQL'ing!! http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

 

http://forum.imasters.com.br/public/style_emoticons/default/clap.gif Resolvi meu problema, obrigado pela aula.

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.