[OFF] MySQL: ordenação de resultados com acentos

519 views
Skip to first unread message

Alessandro Santos

unread,
Aug 17, 2009, 7:50:26 AM8/17/09
to list...@googlegroups.com
Bom dia senhores(as)

Tenho uma tabela com o seguinte esquema:

ZN_Categoria: id (int), nome (varchar)

São categorias de empresas e áreas de atuação. E tenho nela os
seguintes dados, por exemplo:


Agropecuária
Ótica
Relojoaria
Celulares
Bebidas
...

O SQL "SELECT `id`, `nome` FROM `ZN_Categoria` ORDER BY `nome` ASC" retorna:

Agropecuária
Ótica
Bebidas
Celulares
Relojoaria

As palavras que começam com letras acentuadas aparecem ordenadas entre
a letra A e a B. O banco e as tabelas estão em utf8_general_ci. Alguém
tem alguma luz para que eu possa ordenar esses resultados
corretamente?

--
[]'s & =*'s do lee
http://alessandrosantos.com.br
# Alessandro Ramos dos Santos @ Itaporanga @ SP @ Brasil
# MSN: lee.rain # Gtalk: edenfall # Orkut: 7093009035179968825

"A nação que resolve trocar um pouco de liberdade por um pouco de
ordem não consegue nenhuma das duas, e não merece a ambas" - Thomas
Jefferson

Jean

unread,
Aug 17, 2009, 8:22:19 AM8/17/09
to list...@googlegroups.com
Bom asism de cabeça nao lembro como vc poderia ordenar com esse
esquema de acentuação, porém sempre utilizo latin1_swedish por crer
que seja a formatação mais correta para a nossa acentuação. Por favor
se discordam da minha colocação não precisam me crucificar, apenas
tentem resolver o problema dele.

2009/8/17 Alessandro Santos <eden...@gmail.com>:
--
[]´s Jean a.k.a Suissa

Tecnólogo em Análise de Sistemas - UTF-PR
131

www.twitter.com/suissacorp

Alessandro Santos

unread,
Aug 17, 2009, 9:29:39 AM8/17/09
to list...@googlegroups.com
Então, tentei da seguinte forma:

SELECT * FROM `ZN_Categoria` ORDER BY `nome` COLLATE latin1_swedish_ci;

Retorna:

ERROR 1253 (42000): COLLATION 'latin1_swedish_ci' is not valid for
CHARACTER SET 'utf8'

Detalhe que deixei passar no primeiro e-mail: o sistema é linux, não
sei se interfere e as tabelas são innoDB.

A ordenação zuada acontece aqui na máquina que to desenvolvendo e no servidor.

Procurando por alguns fóruns achei duas soluções que não acho muito elegantes:


1 - criar mais um campo para armazenar os dados sem os acentos e
ordenar por eles, por exemplo
ZN_Categoria: id(int), nome(varchar), nome_s_a(varchar)
1 Agropecuária agropecuaria
2 Ótica otica
... e por aí vai...


2 - passar os resultados para um array, retirar os acentos, ordenar e
devolver os acentos


Pra mim parece gambiarra, rs... queria achar um jeito de resolver isso
no MySQL mesmo. Alguém aqui já deve ter passado por isso, eu acho.


O create da tabela:

CREATE TABLE ZN_Categoria (
id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
nome VARCHAR(64) NOT NULL,
PRIMARY KEY(id)
)
TYPE=InnoDB;



2009/8/17 Jean <jnasc...@gmail.com>:

Alessandro Santos

unread,
Aug 17, 2009, 9:45:50 AM8/17/09
to list...@googlegroups.com
Acho que resolvi o problema.

O create da tabela estava:

> CREATE TABLE ZN_Categoria (
>  id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
>  nome VARCHAR(64) NOT NULL,
>  PRIMARY KEY(id)
> )
> TYPE=InnoDB;

faltava definir o charset ali

> CREATE TABLE ZN_Categoria (
>  id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
>  nome VARCHAR(64) NOT NULL,
>  PRIMARY KEY(id)
> )
> TYPE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;

Rodei um teste aqui e funcionou legal. Vamos ver.

2009/8/17 Alessandro Santos <eden...@gmail.com>:

Jean

unread,
Aug 17, 2009, 10:12:51 AM8/17/09
to list...@googlegroups.com
Bom saber q a falta de charset pode dar esses problemas, por isso
sempre coloco ;D

2009/8/17 Alessandro Santos <eden...@gmail.com>:

Igor Escobar

unread,
Aug 17, 2009, 9:12:28 AM8/17/09
to list...@googlegroups.com
Alessandro, a forma como você está fazendo deveria funcionar! Tente analizar melhor e certificar-se de que os dados que estão sendo inseridos na sua base de dados estão mesmo em utf-8 ou se a sua base de dados está mesmo em utf-8.

O ORDER BY [tabela] ASC deveria funcionar perfeitamente.


Regards,
Igor Escobar
Systems Analyst & Interface Designer

+ http://blog.igorescobar.com
+ http://www.igorescobar.com
+ @igorescobar (twitter)





2009/8/17 Jean <jnasc...@gmail.com>

Igor Escobar

unread,
Aug 17, 2009, 10:11:52 AM8/17/09
to list...@googlegroups.com
Pois é, quando definimos um charset para o projeto todas as camadas do sistema devem estar com o mesmo charset.

Abraços.



Regards,
Igor Escobar
Systems Analyst & Interface Designer

+ http://blog.igorescobar.com
+ http://www.igorescobar.com
+ @igorescobar (twitter)





2009/8/17 Alessandro Santos <eden...@gmail.com>

Alessandro Santos

unread,
Aug 17, 2009, 10:25:22 AM8/17/09
to list...@googlegroups.com
Então, era isso e

<?php
mysql_connect(...);
mysql_set_charset('utf8');
?>

2009/8/17 Jean <jnasc...@gmail.com>:

Alessandro Santos

unread,
Aug 17, 2009, 10:36:51 AM8/17/09
to list...@googlegroups.com
Opa.

Então, a tabela está correta, o problema estava nos dados que vinham
pela aplicação.

A função do PHP mysql_client_encoding() retornava 'latin1'.

Esse tempo todo eu inserindo dados pela aplicação. Achei que seria
alguma coisa na conexão da aplicação com o MySQL pois os dados
inseridos pelo phpmyadmin ordenavam direito.

Foi só setar o charset da conexão pra utf8... vivendo e aprendendo =D

obrigado a todos pela ajuda

2009/8/17 Igor Escobar <titio...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages