Entendi, Então isso pode ser alterado no arquivo php.ini, no default_charset, mais mesmo assim é estranho.
Observe no código fonte do PHP em ext/mysql/php_mysql.c a função é bem clara, /* Returns the default character set for the current connection */ PHP_FUNCTION(mysql_client_encoding) {...} Att Eder. On 2/25/07, Rafael Fernandes <[EMAIL PROTECTED]> wrote: > Não precisa de muito para fazer o teste não. Apenas rode o código a seguir: > > --------- teste.php > <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" > "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> > <html xmlns="http://www.w3.org/1999/xhtml"> > <head> > <meta http-equiv="Content-Type" content="text/html; > charset=iso-8859-1" /> > <title>Character-set de conexão com o mysql</title> > </head> > <body> > <?php > > // Ok, vamos brincar com um texto antes usando o que temos de charset > // de conexão padrão no servidor (deveria ser latin1, se não foi ajustado > // outra coisa ao compilar a biblioteca) > mysql_connect( "localhost", "root", "leleafar" ); > // Vamos ver qual é o charset padrão usado na conexão. > $r = mysql_fetch_row(mysql_query("select charset('abc');")); > echo "<p>Charset Padrão desta conexão: $r[0]</p>\n"; > // Bom, vamos fazer uma tabelinha com o charset latin1 no banco test > // que o mysql cria por padrão > if (mysql_query("create table if not exists `test`.`chartest` (texto TEXT) > character set latin1;")) > echo "<p>Tabela criada!</p>"; > else { > echo "<p>Erro ao criar a tabela.</p>"; > exit(0); > } > // Beleza, vamos fazer um teste para guardar o texto com acentuação > $texto = "áéíóçãõà"; > echo "<p>Texto para testes: $texto (deve estar aparecendo corretamente no > navegador!)</p>\n"; > mysql_query("insert into `test`.`chartest` set texto = '$texto';"); > // Vamos ver o que ele guardou? > $r = mysql_fetch_row(mysql_query("select texto from `test`.`chartest`;")); > if ($r[0] == $texto) > echo "<p>O texto permanece igual!</p>"; > else > // isto não deveria acontecer se seu módulo mysql estiver em latin1 > echo "<p>Opa, o texto foi modificado! Texto retornado: $r[0]</p>\n"; > mysql_close(); > // Ok, o legal é que o código acima tenha como resultado o texto > permanecer igual. Isto quer dizer que nossa conexão é latin1, > // Mas, qual seria o resultado se nossa conexão fosse, por padrão, em > utf-8? Vamos descobrir. > mysql_connect( "localhost", "root", "leleafar" ); > // Vamos mudar o charset da conexão apenas (deve ser a primeira coisa a > ser feita, pelo o que está na documentação); > // Leia sobre isto onde indiquei anteriormente: > http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html > mysql_query("set NAMES utf8;"); > // Vamos fazer nosso teste de descobrir qual o charset padrão para > verificar se deu certo a query anterior. > $r = mysql_fetch_row(mysql_query("select charset('abc');")); > // Deve mostrar utf8 como resultado. > echo "<p>Charset Padrão desta conexão: $r[0]</p>\n"; > // Vamos ver o que ele retorna pra gente agora? > $r = mysql_fetch_row(mysql_query("select texto from `test`.`chartest`;")); > if ($r[0] == $texto) > echo "<p>O texto permanece igual!</p>"; > else > echo "<p>Opa, o texto foi modificado! Texto retornado: $r[0]</p>\n"; > // Se o charset padrão desta conexão for utf-8, você já percebeu que o > texto foi "alterado"... mas nem tanto! > // Na verdade, seu texto foi retornado em utf-8, MESMO COM A TABELA > MARCADA COMO LATIN1 > // Vamos conferir? > if ($texto == utf8_decode($r[0])) > echo "<p>É o mesmo texto realmente, só que foi retornado em > UTF-8!</p>\n"; > /* Entendeu o problema? O problema não é na tabela, nem no locale, e sim > no charset usado pelo módulo php, que tem > o charset padrão dependente de como foi compilada antes a biblioteca do > mysql, pois não conheço arquivo de > configuração para esta biblioteca. */ > // Vamos acabar com nossa tabela de testes > mysql_query("drop table `test`.`chartest`;"); > mysql_close(); > ?> > </body> > --------- fim > > Como te disse, no meu caso, é complicado ajustar os scripts para usar > uft8_decode ou a query de mudar o charset da conexão num site de mais de 8 > anos (onde trabalhei apenas nos 2 últimos), que passou por várias pessoas > diferentes, e com vários setores desenvolvidos por pessoas diferentes, > quase sempre de maneira totalmente desorganizada. > > A solução simples e eficiente no meu caso foi recompilar a biblioteca e o > módulo para usarem latin1 como padrão de conexão, pois estavam em utf-8. > > Acho que agora estará satisfeito, vendo o resultado disto com os próprios > olhos. > > Até, > > Rafael. > > On Sun, 25 Feb 2007 13:32:16 -0300, Eder <[EMAIL PROTECTED]> wrote: > > > Em momento algum disse que não acreditava em suas explicações, > > tanto que não contestei o resto do email, porque o que falou está > > correto. > > > > Simplesmente procurei, e não encontrei nada que o justificase, inclusive > > compilei o PHP aqui na minha máquina, via ports, e modulo php para MySQL, > > mais não tive o problema, agora se eu alterar os caracteres no database > > do MySQL > > para outro tipo, os acentos não entram corretos, ou entram de forma > > errônea. > > Em Latin1 funciona corretamente. > > > >>> espero que não venha a ter o problema que tivemos. > > > > R = Eu espero ter sim, assim posso testar realmente se o que falou, > > se contesta, como posso simular o erro? > > > > Att Eder. > > > > > > On 2/25/07, Rafael Fernandes <[EMAIL PROTECTED]> wrote: > >> Como te disse, no caso do que aconteceu comigo e com nosso colega de > >> lista, mudar o charset da tabela não resolveria. > >> Eu tentei explicar da melhor maneira possível mas se ainda assim não > >> acredita no que estou explicando, espero que não venha a ter o problema > >> que tivemos. > >> > >> Até, > >> > >> Rafael. > >> > >> On Sun, 25 Feb 2007 12:37:17 -0300, Eder <[EMAIL PROTECTED]> wrote: > >> > >> >>> No meu caso, mudar estas configurações no servidor mysql não > >> resolveu. > >> >>> O > >> >>> servidor mudou sim de charset usado nas conexões, mas o módulo do > >> php > >> >>> não. > >> >>> E o módulo do php depende da biblioteca do mysql, que por sua vez > >> tem > >> >>> em > >> >>> seu código pre-definido quando compilado qual o charset padrão. Eu > >> não > >> >>> sei > >> >>> como mudar o padrão da biblioteca sem recompilar, se você souber me > >> >>> desculpe mas é que não encontrei outro meio mesmo. > >> > > >> > R = Como eu disse não entendo de PHP, mais creio que não é necessário > >> > recompilar nada, como sugere eu recompilar um C/C++? > >> > > >> > Basta alterar essas configurações no banco. > >> > > >> > ALTER DATABASE name_database DEFAULT CHARACTER SET latin1 COLLATE > >> > latin1_swedish_ci; > >> > > >> > Att, Eder. > >> > > >> > > >> > On 2/25/07, Rafael Fernandes <[EMAIL PROTECTED]> wrote: > >> >> Oi de novo! :D > >> >> > >> >> Quando um cliente de mysql conecta ao banco, via o cliente padrão > >> mysql > >> >> ou > >> >> biblioteca, existe a negociação de um charset para a interpretação do > >> >> texto enviado entre ambos, independente dos dados do banco ou do > >> texto > >> >> da > >> >> linguagem (em c++ ou no caso o php). Quer dizer, temos 1 "camada" de > >> >> conversão de charsets internamente no servidor mysql quando ele > >> >> lê/escreve > >> >> nas tabelas, 1 "camada" de conversão de charsets quando os dados > >> >> trafegam > >> >> entre o servidor e o cliente/biblioteca mysql (esta camada tanto não > >> >> segue > >> >> locale, apenas uma negociação entre o servidor e o > >> cliente/biblioteca, > >> >> quanto é a causa do problema inicial), e + 1 "camada" quando o texto > >> é > >> >> trabalhado no programa do usuário. > >> >> Por exemplo, uma string no php usaria a codificação iso por padrão. > >> Mas, > >> >> se você usa um módulo de php que conecta ao servidor em utf-8, você > >> deve > >> >> codificar esta string em uft-8 antes de enviar por um mysql_query. > >> Como > >> >> a > >> >> diferença mesmo entre as 2 codificações são os acentos e outros > >> >> caracteres > >> >> acima de 127 (o que não afeta a sintaxe do mysql, e claro não estou > >> >> falando de codificações com 2 bytes ou mais como a unicode), ocorre o > >> >> problema que foi colocado, a "não aceitação" de acentos, com o mysql > >> >> recebendo os códigos de caractere em codificação diferente da > >> informada > >> >> pela conexão do cliente (no caso, o próprio módulo do php). > >> >> > >> >> Ficar tomando cuidado com quando usar as funções utf8_encode e > >> >> utf8_decode > >> >> no PHP levaria às "aleatoriedades" que mencionei, principalmente > >> quando > >> >> você migra código e dados desenvolvidos com a espectativa de que > >> estas > >> >> funções não seriam necessárias. Usar o setlocale no php também não > >> >> resolveria porque isto modificaria apenas o processamento interno do > >> php > >> >> em relação às strings (no caso do seu exemplo, mudaria a "colagem": > >> qual > >> >> caractere com acentuação é ligado com qual caractere "puro". O "case > >> >> insensitive" é um tipo de colagem: cola minúsculas com maiúsculas, > >> não > >> >> diferenciando elas), horário, moeda e outras coisas, e não quando ele > >> >> envia texto pelo módulo. Eu mesmo tive que arrumar muitas páginas php > >> >> com > >> >> as funções utf8 enquanto tentava descobrir esse detalhe da > >> codificação > >> >> da > >> >> conexão. > >> >> > >> >> No meu caso, mudar estas configurações no servidor mysql não > >> resolveu. O > >> >> servidor mudou sim de charset usado nas conexões, mas o módulo do php > >> >> não. > >> >> E o módulo do php depende da biblioteca do mysql, que por sua vez > >> tem em > >> >> seu código pre-definido quando compilado qual o charset padrão. Eu > >> não > >> >> sei > >> >> como mudar o padrão da biblioteca sem recompilar, se você souber me > >> >> desculpe mas é que não encontrei outro meio mesmo. > >> >> > >> >> O que tinha sugerido para solução é justamente isto: recompilando o > >> >> mysql-server, seria recompilada também a biblioteca, usando o mesmo > >> >> charset para conexões por padrão, se o módulo do php dele fosse > >> linkado > >> >> dinamicamente isto já resolveria também o problema dentro do php (se > >> o > >> >> módulo for linkado estaticamente com a biblioteca mysql, seria > >> >> necessário > >> >> recompilá-lo também!), então ele não seria obrigado a usar as funções > >> >> utf8 > >> >> sempre que quisesse fazer uma query ao banco. Se ele não tiver um > >> >> computador que seja antigo a ponto de isto ser proibitivo, é mais > >> >> simples > >> >> fazer o que sugeri ao invéz de tudo o que envolveria se fosse > >> resolver > >> >> de > >> >> outro modo. Claro que eu estava me baseando no meu caso, num site > >> onde > >> >> existem vários sub-sites, cada um feito por um tipo de pessoa, com > >> nível > >> >> de conhecimento também variável, pior seria se eu me preocupasse em > >> >> ajustar isto pelo php. E acreditei que isto também serviria para ele, > >> >> até > >> >> porque seria uma chamada de função a menos para cada query. > >> >> > >> >> O que eu tinha entendido, pela sua primeira mensagem, era que você > >> >> esperava que o problema fosse solucionado com a mudança do charset da > >> >> tabela, o que ele já havia tentado. Por isto, pensei que você não > >> >> estivesse muito a par de outras causas para o problema inicial, assim > >> >> como > >> >> a pessoa que o colocou em questão. Não foi minha intenção caçoar de > >> >> você, > >> >> apenas esclarecer o porquê da minha sugestão. ;) > >> >> > >> >> Até, > >> >> > >> >> Rafael. > >> >> > >> >> > >> >> > Oi, > >> >> > > >> >> >>> O problema, Eder, é que pode haver uma diferença de charset > >> usado na > >> >> >>> conexão entre o cliente e o servidor mysql. > >> >> > > >> >> > R = Obviamente que pode haver, por isso existem os locales. Tanto > >> no > >> >> > banco quanto na linguagem, não entendo muito de PHP, mais em C, C++ > >> >> > basta passar o locale. > >> >> > > >> >> >>> E o problema continua mesmo depois de mudado o charset > >> >> >>> de uma tabela que era utf-8 para latin1. Como disse, não é um > >> >> problema > >> >> >>> no > >> >> >>> chaset usado pelo servidor, mas sim pela conexão entre o > >> servidor e > >> >> um > >> >> >>> cliente mysql, pois nessa ele tenta fazer uma conversão de > >> charsets. > >> >> >>> Leia > >> >> >>> sobre isto aqui: > >> >> > > >> >> > R = Concordo, então no PHP set o locale, > >> >> > > >> >> > setlocale(LC_COLLATE, "pt_BR.ISO8859-1"); > >> >> > > >> >> >>> A única coisa que fez os resultados de queries serem consistentes > >> >> foi > >> >> >>> certificando que ambos os binários (cliente e servidor) usavam o > >> >> mesmo > >> >> >>> charset padrão para conexões. E infelizmente isto fica compilado > >> >> com os > >> >> >>> binários, não fica em um arquivo de configuração. Senão não > >> >> >>> precisaríamos > >> >> >>> de ajustar esta opção ao compilar o mysql, certo? > >> >> > > >> >> > R = Errado, não é necessário recompilar o MySQL para configurar > >> isso, > >> >> se > >> >> > ele por > >> >> > padrão já é compilado com suporte aos characters. > >> >> > > >> >> > mysql> SHOW VARIABLES LIKE 'coll%'; > >> >> > mysql> SHOW VARIABLES LIKE 'character%'; > >> >> > > >> >> > No arquivo de configuração do mysql no /etc/my.cnf basta setar o > >> >> locale. > >> >> > > >> >> > [mysqld] > >> >> > character_sets_dir=/usr/local/share/mysql/charsets/ > >> >> > default-character-set=utf8 > >> >> > default-collation=utf8_general_ci > >> >> > > >> >> > [client] > >> >> > default-character-set=utf8 > >> >> > > >> >> >>> Então, me desculpe, mas listar os charsets disponíveis para as > >> >> tabelas > >> >> >>> não > >> >> >>> resolveria o problema do nosso amigo da lista. > >> >> > > >> >> > R = Realmente digitar o comando não resolveria em nada. > >> >> > > >> >> > Att Eder, > >> >> > > >> >> > > >> >> > On 2/24/07, Rafael Fernandes <[EMAIL PROTECTED]> wrote: > >> >> >> O problema, Eder, é que pode haver uma diferença de charset usado > >> na > >> >> >> conexão entre o cliente e o servidor mysql. > >> >> >> > >> >> >> Normalmente, no módulo php, isto acarreta em aleatoriamente você > >> >> receber > >> >> >> os dados em latin1 e utf-8, mesmo quando uma tabela está com a > >> opção > >> >> de > >> >> >> charset em latin1. E o problema continua mesmo depois de mudado o > >> >> >> charset > >> >> >> de uma tabela que era utf-8 para latin1. Como disse, não é um > >> >> problema > >> >> >> no > >> >> >> chaset usado pelo servidor, mas sim pela conexão entre o servidor > >> e > >> >> um > >> >> >> cliente mysql, pois nessa ele tenta fazer uma conversão de > >> charsets. > >> >> >> Leia > >> >> >> sobre isto aqui: > >> >> >> http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html > >> >> >> > >> >> >> Este problema aconteceu comigo quando migrei um banco de dados de > >> um > >> >> >> servidor para outro. Como o charset da tabela não foi alterado, > >> não > >> >> era > >> >> >> para ocorrer este tipo de problema. E a única diferença entre um > >> >> >> servidor > >> >> >> e outro era que o charset padrão usado nas conexões era diferente > >> >> >> (latin1 > >> >> >> no antigo, utf-8 no novo). > >> >> >> > >> >> >> A única coisa que fez os resultados de queries serem consistentes > >> foi > >> >> >> certificando que ambos os binários (cliente e servidor) usavam o > >> >> mesmo > >> >> >> charset padrão para conexões. E infelizmente isto fica compilado > >> com > >> >> os > >> >> >> binários, não fica em um arquivo de configuração. Senão não > >> >> >> precisaríamos > >> >> >> de ajustar esta opção ao compilar o mysql, certo? > >> >> >> > >> >> >> Então, me desculpe, mas listar os charsets disponíveis para as > >> >> tabelas > >> >> >> não > >> >> >> resolveria o problema do nosso amigo da lista. > >> >> >> > >> >> >> Até, > >> >> >> > >> >> >> Rafael. > >> >> >> > >> >> >> On Sat, 24 Feb 2007 15:20:04 -0200, Eder <[EMAIL PROTECTED]> > >> wrote: > >> >> >> > >> >> >> > Olá, > >> >> >> > > >> >> >> > Basta alterar o character sets. > >> >> >> > > >> >> >> > mysql> SHOW CHARACTER SET; > >> >> >> > > >> >> >> > http://dev.mysql.com/doc/refman/5.0/en/charset-mysql.html > >> >> >> > > >> >> >> > Att, eder. > >> >> >> > > >> >> >> > On 2/23/07, Rafael Fernandes <[EMAIL PROTECTED]> wrote: > >> >> >> >> É amigo eu passei por isto e normalmente o mysql fica com o > >> >> charset > >> >> >> >> compilado tanto no servidor quanto no cliente (ou bibliotecas > >> >> usadas > >> >> >> por > >> >> >> >> outros programas, no caso o php). > >> >> >> >> O que solucionou meu problema 100% foi recompilar o > >> mysql-server > >> >> (se > >> >> >> não > >> >> >> >> me engano, isto já recompila a biblioteca mysql-server, mas > >> >> confira). > >> >> >> >> Recompile também o módulo mysql do php se ele foi linkado > >> >> >> estaticamente > >> >> >> >> com a biblioteca mysql. > >> >> >> >> > >> >> >> >> Lembre-se sempre que usamos latin1/iso-8859-1 (são a mesma > >> coisa) > >> >> e > >> >> >> irá > >> >> >> >> evitar muita dor de cabeça. > >> >> >> >> > >> >> >> >> Até, > >> >> >> >> > >> >> >> >> Rafael. > >> >> >> >> > >> >> >> >> On Fri, 23 Feb 2007 11:56:32 -0200, Rafael Stockler > >> >> >> >> <[EMAIL PROTECTED]> wrote: > >> >> >> >> > >> >> >> >> > Bom dia a todos, > >> >> >> >> > > >> >> >> >> > Estou com o seguinte problema. > >> >> >> >> > > >> >> >> >> > Tenho aqui instalado o Apache 2, php 5 e mysql 5. > >> >> >> >> > > >> >> >> >> > O problema que estou enfrentando é o fato de o mysql não > >> estar > >> >> >> >> > cadastrando palavras com acentos. Verifiquei se o php estava > >> >> >> mostrando > >> >> >> >> > certo e pelo q vi sim. > >> >> >> >> > > >> >> >> >> > O charset no mysql eh o utf8-general. Jah tentei colocar o > >> >> latin 1 > >> >> >> e > >> >> >> >> > outras e nada. > >> >> >> >> > > >> >> >> >> > Alguem já passou por isso ou saberia o q pode ser isso? > >> >> >> >> > > >> >> >> >> > Vlw. > >> >> >> >> > ------------------------- > >> >> >> >> > Histórico: http://www.fug.com.br/historico/html/freebsd/ > >> >> >> >> > Sair da lista: > >> https://www.fug.com.br/mailman/listinfo/freebsd > >> >> >> >> > >> >> >> >> > >> >> >> >> ------------------------- > >> >> >> >> Histórico: http://www.fug.com.br/historico/html/freebsd/ > >> >> >> >> Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd > >> >> >> >> > >> >> >> > > >> >> >> > > >> >> >> > >> >> >> > >> >> >> ------------------------- > >> >> >> Histórico: http://www.fug.com.br/historico/html/freebsd/ > >> >> >> Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd > >> >> >> > >> >> > > >> >> > > >> >> > >> >> > >> >> ------------------------- > >> >> Histórico: http://www.fug.com.br/historico/html/freebsd/ > >> >> Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd > >> >> > >> > > >> > > >> > >> > >> ------------------------- > >> Histórico: http://www.fug.com.br/historico/html/freebsd/ > >> Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd > >> > > > > > > > ------------------------- > Histórico: http://www.fug.com.br/historico/html/freebsd/ > Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd > -- "Do not worry about your difficulties in mathematics; I can assure you that mine are still greater." Albert Einstein ------------------------- Histórico: http://www.fug.com.br/historico/html/freebsd/ Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd