Jump to content


Photo

Função - Problema C/ Acentuação - Collate


  • Faça o login para participar
5 replies to this topic

#1 Anderson de Camargo

Anderson de Camargo

    Novato no fórum

  • Usuários
  • 3 posts
  • Sexo:Masculino
  • Localidade:Jandira - SP - Brasil

Posted 20/12/2011, 18:15

Preciso de um help.


Estou criando uma função para determinar se um certo caracter é ou não alfanumérico (não encontrei no mysql uma já pronta para isto).
Porém, quando vou consulta-lá após criada, vejo que o MySql fez uma zona com meus acentos (quando digito os comandos abaixo posso ver isto).

use mysql;
select body from proc;

Nesta consulta eu vejo o código fonte da função criada... mas os acentos viraram caracteres estranhos. :wacko:

O problema é que minha função é exatamente para comparação de caracteres, e ela está funcionando indevidamente por causa disto.

Segue abaixo a função:
DROP FUNCTION IF EXISTS alfa;

delimiter //
CREATE FUNCTION alfa (caracter varchar(1)) RETURNS tinyint(1)
BEGIN
  declare result tinyint(1) default 0;

  if caracter="0" or caracter="1" or caracter="2" or caracter="3" or caracter="4" or caracter="5" or caracter="6" or caracter="7" or caracter="8" or caracter="9" or caracter="a" or caracter="á" or caracter="â" or caracter="à" or caracter="ã" or caracter="ä" or caracter="A" or caracter="Á" or caracter="Â" or caracter="À" or caracter="Ã" or caracter="Ä" or caracter="e" or caracter="é" or caracter="è" or caracter="ê" or caracter="ë" or caracter="E" or caracter="É" or caracter="È" or caracter="Ê" or caracter="Ë" or caracter="i" or caracter="í" or caracter="ì" or caracter="î" or caracter="ï" or caracter="I" or caracter="Í" or caracter="Ì" or caracter="Ï" or caracter="o" or caracter="ó" or caracter="ò" or caracter="ô" or caracter="õ" or caracter="ö" or caracter="O" or caracter="Ó" or caracter="Ò" or caracter="Õ" or caracter="Ô" or caracter="Ö" or caracter="u" or caracter="ú" or caracter="ù" or caracter="û" or caracter="ü" or caracter="U" or caracter="Ú" or caracter="Ù" or caracter="Û" or caracter="Ü" or caracter="b" or caracter="c" or caracter="d" or caracter="f" or caracter="g" or caracter="h" or caracter="i" or caracter="j" or caracter="k" or caracter="l" or caracter="m" or caracter="n" or caracter="o" or caracter="p" or caracter="q" or caracter="r" or caracter="s" or caracter="t" or caracter="u" or caracter="w" or caracter="v" or caracter="x" or caracter="y" or caracter="z" or caracter="ÿ" or caracter="B" or caracter="C" or caracter="D" or caracter="F" or caracter="G" or caracter="H" or caracter="J" or caracter="K" or caracter="L" or caracter="M" or caracter="N" or caracter="P" or caracter="Q" or caracter="R" or caracter="S" or caracter="T" or caracter="W" or caracter="V" or caracter="X" or caracter="Y" or caracter="Z" or caracter="ç"  or caracter="Ç" then
	set result=1;
  end if;
	
	RETURN result;
END
//
delimiter;

Quando digito o comando abaixo, ele me retorna 1: :)
select alfa("a");

Mas, se digito isto, me retorna 0: :(
select alfa("á");


Obviamente, deveria retornar 1 para ambos os casos.


Eu tentei fazer o seguinte:
alter database test CHARACTER SET=latin1 COLLATE=latin1_general_ci;

Depois disto, saí do mysql, entrei novamente, dei drop e recriei a função. NADA FEITO.


O que eu posso fazer??

Desde já agradeço a ajuda.

#2 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 20/12/2011, 18:27

Como a função fica no banco mysql, acho que é o collation dele que você deveria alterar. Nunca alterei isso nesse banco em particular, então não sei os efeitos, mas testa aí. Qualquer coisa, você pode usar regex. Pelo menos não precisa fazer uma função própria.

SELECT 'á' REGEXP '[[:alnum:]]'


#3 Anderson de Camargo

Anderson de Camargo

    Novato no fórum

  • Usuários
  • 3 posts
  • Sexo:Masculino
  • Localidade:Jandira - SP - Brasil

Posted 20/12/2011, 18:48

Como a função fica no banco mysql, acho que é o collation dele que você deveria alterar. Nunca alterei isso nesse banco em particular, então não sei os efeitos, mas testa aí. Qualquer coisa, você pode usar regex. Pelo menos não precisa fazer uma função própria.

SELECT 'á' REGEXP '[[:alnum:]]'



Valew mano.. aprendi mais uma função.

Mas não deu certo. Alterei o collate do banco 'mysql' e tbm da tabela 'proc'. Dropei a função e rodei novamente. Deu errado.

Quanto ao REGEXP, a sintaxe q vc me passou (usando 'á' como argumento), retornou 0. Mas com 'a' retorna 1. Será que estou usando o collate errado?

#4 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 20/12/2011, 19:45

Está rodando local ou online? Não manjo muito disso, mas de repente é alguma configuração do próprio servidor. Manda um SHOW VARIABLES e dá uma olhada nas variáveis character_set_*. Vê se aparece alguém diferente de latin1 ou uft8. Na pior das situações, você pode listar os caracteres manualmente.

SELECT 'á' REGEXP '[0-9aáãà]'


#5 Anderson de Camargo

Anderson de Camargo

    Novato no fórum

  • Usuários
  • 3 posts
  • Sexo:Masculino
  • Localidade:Jandira - SP - Brasil

Posted 21/12/2011, 14:59

Está rodando local ou online? Não manjo muito disso, mas de repente é alguma configuração do próprio servidor. Manda um SHOW VARIABLES e dá uma olhada nas variáveis character_set_*. Vê se aparece alguém diferente de latin1 ou uft8. Na pior das situações, você pode listar os caracteres manualmente.

SELECT 'á' REGEXP '[0-9aáãà]'



Todas as character_set_* estão como latin1

somente a *_filesystem está como Binary e a *_system está como UTF8.

Usando o REGEXP manualmente, deu certo. Sendo assim, por hora, PROBLEMA RESOLVIDO.



Valew!

Descobri uma coisa interessante.


A função funciona quando crio diretamente na tela da console. O Mysql reconhece perfeitamente os acentuados.
Antes eu estava criando a função em arquivo .sql e depois chamando o arquivo com "SOURCE C:/DATA/ARQUIVO.SQL".

Testei criar o arquivo .sql em 3 editores diferentes (sendo um deles o NOTEPAD), mas sempre da pau com os acentos (não no editor, mas no banco).

O que diabos pode estar ocorrendo?

*Obs.: Não estou parado por causa disto, só estou 'encucado' com esta questão.

Edição feita por: Anderson de Camargo, 21/12/2011, 14:58.


#6 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 22/12/2011, 12:24

Ah, essa era uma informação importante. Olha só:

http://dev.mysql.com...l-commands.html

Tem um comando "charset". Faz um teste com ele pra ser funciona.

mysql>charset latin1
mysql>source C:/data/arquivo.sql





1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq