Ir para conteúdo

POWERED BY:

Arquivado

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

John McLane

Mysql e Acentuação

Recommended Posts

Aos que não querem ler muito, explico resumido: quando insiro algo pelo php num banco mysql, ele exibe correto via php mas exibe com problemas de acentuacao no terminal. Quando insiro algo diretamente no banco pelo terminal, ele exibe correto no terminal mas quando recupero pelo php os acentos saem errados. Sei que trata-se de algo relacionado aos charsets, mas nao estou conseguindo resolver.

 

Aos que preferem mais detalhes, explico:

 

Não consigo entender o que está errado. Só falta esse pequeno ajuste pra colocar no ar, já quebrei a cabeça e não sei resolver. Tomara que alguem me ajude.

 

Tenho uma tabela que possui entre outros campos númericos, varchars dessa forma descritos:

| id_imovel | int(10) unsigned | NULL | NO | PRI | NULL | auto_increment

| nome | varchar(255) | utf8_unicode_ci | NO | | |

| endereco | varchar(255) | utf8_unicode_ci | NO | | |

 

Meu banco está assim:

mysql> show create database db_respeito;

+-------------+----------------------------------------------------------------------+

| Database | Create Database |

+-------------+----------------------------------------------------------------------+

| db_respeito | CREATE DATABASE `db_respeito` /*!40100 DEFAULT CHARACTER SET utf8 */ |

+-------------+----------------------------------------------------------------------+

1 row in set (0.00 sec)

 

Se eu entrar no terminal e inserir algo como:

insert into tb_imoveis values (NULL, 'Açaí do João', 'Atrás do Sótão',2,2)

+--------------+-----------+

| nome | id_imovel |

+--------------+-----------+

| Açaí do João | 1858 |

+--------------+-----------+

 

Porém caso eu insira pelo php com algo como

$query = "insert into tb_imoveis values (NULL, 'Açaí do João', 'Atrás do Sótão',3,3)";

$resultado = insereBD($query);

 

e depois consulte pelo terminal aparecem problemas de acentuação

+--------------+-----------+

| nome | id_imovel |

+--------------+-----------+

| AþaÝ do JoÒo | 1859 |

+--------------+-----------+

 

Se agora eu consultar esses dados pelo php o resultado aparece lindamente no navegador. Estou fazendo algo como:

$query = "Select nome from tb_imoveis where id_imovel=1859";

$resultado=acessaBD($query);

$linha = mysql_fetch_array($resultado);

echo $linha['nome'];

 

Pelo que eu tenho pesquisado, acredito que o problema eh que o mysql está usando um charset e o php (ou o apache, nao sei) esta usando outro. Porem, como ajeito? Eu tentei deletar o banco de dados, e criei um todo latin1 pra ve se resolvia, mas nesse caso passou a exibir errado tanto ná página em php quanto no banco de dados. O banco "todo latin1" a que eu me refiro eu criei assim:

CREATE TABLE `tb_imoveis` (

`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,

`nome` VARCHAR( 255 ) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL ,

`endereco` VARCHAR( 255 ) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL

) ENGINE = innodb CHARACTER SET latin1 COLLATE latin1_swedish_ci;

 

Minhas variáveis do sistema estão assim:

mysql> show variables like 'c%';

+--------------------------+-----------------------------------------------+

| Variable_name | Value |

+--------------------------+-----------------------------------------------+

| character_set_client | latin1 |

| character_set_connection | latin1 |

| character_set_database | latin1 |

| character_set_filesystem | binary |

| character_set_results | latin1 |

| character_set_server | utf8 |

| character_set_system | utf8 |

| character_sets_dir | h:\wamp\bin\mysql\mysql5.0.45\share\charsets\ |

| collation_connection | latin1_swedish_ci |

| collation_database | latin1_swedish_ci |

| collation_server | utf8_general_ci |

| completion_type | 0 |

| concurrent_insert | 1 |

| connect_timeout | 5 |

+--------------------------+-----------------------------------------------+

14 rows in set (0.00 sec)

 

O que faço? Alguém me ajuda?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seu banco de dados está em utf8 e a página php em (provavelmente) latim1, pra resolver isso você pode usar a função utf8_encode antes de enviar pro banco de dados e utf8_decode antes de exibir.

 

Ou melhor, faça as páginas HTML e arquivos PHP tudo em utf8, assim não vai nem precisar usar esas funções. Pro HTML ficar em utf-8 insira ou substitua pelo seguinte.

Latim1 (como deve estar): <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />

UTF-8 (deve arrumar a exibição): <meta http-equiv="content-type" content="text/html; charset=utf8" />

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu criei outro banco para testar, coloquei tudo utf-8 e o problema continua.

Olha as configuracoes como estao:

mysql> show variables like 'c%';
+--------------------------+-----------------------------------------------+
| Variable_name			| Value										 |
+--------------------------+-----------------------------------------------+
| character_set_client	 | utf8										  |
| character_set_connection | utf8										  |
| character_set_database   | utf8										  |
| character_set_filesystem | binary										|
| character_set_results	| utf8										  |
| character_set_server	 | utf8										  |
| character_set_system	 | utf8										  |
| character_sets_dir	   | h:\wamp\bin\mysql\mysql5.0.45\share\charsets\ |
| collation_connection	 | utf8_general_ci							   |
| collation_database	   | utf8_unicode_ci							   |
| collation_server		 | utf8_general_ci							   |
| completion_type		  | 0											 |

| concurrent_insert		| 1											 |
| connect_timeout		  | 5											 |
+--------------------------+-----------------------------------------------+
14 rows in set (0.00 sec)

mysql> show create database testutf;
+----------+------------------------------------------------------------------+
| Database | Create Database												  |
+----------+------------------------------------------------------------------+
| testutf  | CREATE DATABASE `testutf` /*!40100 DEFAULT CHARACTER SET utf8 */ |

+----------+------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> show create table nomes;
+-------+-----------------------------------------------------------------------
--------------------------------------------------------------------------------
---------------------+
| Table | Create Table

					 |
+-------+-----------------------------------------------------------------------
--------------------------------------------------------------------------------
---------------------+
| nomes | CREATE TABLE `nomes` (
  `id` int(11) NOT NULL auto_increment,
  `nome` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 |
+-------+-----------------------------------------------------------------------
--------------------------------------------------------------------------------
---------------------+
1 row in set (0.00 sec)

Tudo utf8, certo?

 

Meu php ta assim

<meta http-equiv="content-type" content="text/html"; charset="UTF-8"/>
<form action="bd.php" method="post" >
Nome: 
<input type="text" name="nome">
<input type="submit" value="Enviar">
</form>
<?php
header("Content-Type: text/html; charset=UTF-8",true);
/**
 * @author 
 * @copyright 2008
 */
$op = $_GET['op'];
$host = "localhost";
$login_db = "root";
$senha_db = "";
$database = "testutf";
$nome = $_POST['nome'];

	$conexao = mysql_connect($host, $login_db, $senha_db) or die(mysql_error());
	mysql_select_db($database,$conexao) or die("Erro na seleção do BD");
	mysql_query("SET CHARACTER_SET utf8");
	mysql_query("SET NAMES utf8");
	
	if ($nome) {
	$query = "insert into nomes values (NULL, '".$nome."')";
	
	$resultado = mysql_query($query,$conexao);
	}
	
	$query = "Select id, nome from nomes order by id desc limit 10";
	
	$resultado = mysql_query($query,$conexao);
	while ($linha = mysql_fetch_array($resultado)){
		echo $linha[0]." - ".$linha[1]."<br>";	
		}
?>
UTF8 para todos os lados, certo? E o problema continua.

 

Eu insiro "ááá" no forumlário, e quando vou ler pelo php está "ááá", mas quando vou ler no terminal está ├í├í├í.

 

Se eu coloco utf8_encode antes de escrever e utf8_decode antes de ler , piora. Quando eu insiro "ááá" no forumlário, vou ler pelo php está ááá, e quando dou um select no terminal está ├â┬í├â┬í├â┬í.

 

E outra, agora que ta tudo utf8 se eu insiro 'ááá' pelo terminal ele da um warning: | Warning | 1366 | Incorrect string value: '\xA0\xA0\xA0' for column 'nome' at row 1 e não insere nada os caracteres acentuados. Sera que tem a ver com utf8_general_ci e utf8_unicode_ci?

Compartilhar este post


Link para o post
Compartilhar em outros sites

coloca isso no arquivo de conexão....

<?php

$host = "";

$usuario = "";

$senha = "";

$bd = "";

 

$conexao = mysql_connect($host, $usuario, $senha);

mysql_select_db($bd);

mysql_query("SET NAMES utf8");

mysql_query("SET CHARACTER_SET utf8");

?>

e configura seu banco todo para: utf8_unicode_ci

Compartilhar este post


Link para o post
Compartilhar em outros sites

coloca isso no arquivo de conexão....

<?php

$host = "";

$usuario = "";

$senha = "";

$bd = "";

 

$conexao = mysql_connect($host, $usuario, $senha);

mysql_select_db($bd);

mysql_query("SET NAMES utf8");

mysql_query("SET CHARACTER_SET utf8");

?>

e configura seu banco todo para: utf8_unicode_ci

 

 

Opa Cassiano, Obrigado !!!

 

Me ajudou para caramba.

abraços

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.