Jump to content
Fórum Script Brasil
  • 0

Outro problema c/ acentuação (collate)


Anderson de Camargo

Question

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.

Link to comment
Share on other sites

4 answers to this question

Recommended Posts

  • 0

Oi 'Anderson de Camargo',

Corrigi sua função

DROP FUNCTION IF EXISTS alfa;

DELIMITER $$
CREATE FUNCTION alfa (caracter CHAR(1)) RETURNS TINYINT(1)
BEGIN
  DECLARE result TINYINT(1) DEFAULT 0;

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

Link to comment
Share on other sites

  • 0

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.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652.1k
×
×
  • Create New...