Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal, estou com problema para salvar os acentos corretamente no banco de dados mysql.
Segue o trecho de código que estou utilizando pra testes:
<?php
$dbc = mysqli_connect(DBHOST, DBUSER, DBPASS, DBNAME) or die('Não conectou');
$query = "INSERT INTO TESTE (nome) VALUES ('visão')";
$data = mysqli_query($dbc, $query) or die ('Não inseriu');
?>
Não estou usando html, apenas rodando o trecho de código acima pra inserir no banco a palavra VISÃO numa tabela de teste.
No entanto, ao mandar pro banco de dados ele não salva a palavra visão, ele substitui o ã por outros caracteres.
Como deve ser salvo: visão.
Como é salvado: visão.[/size]
Quando executo o select no workbench a palavra é mostrada assim visão.
No entando se faço o seguinte no código php o script roda sem problema:
<?php
$dbc = mysqli_connect(DBHOST, DBUSER, DBPASS, DBNAME) or die('Não conectou');
$query = "INSERT INTO TESTE (nome) VALUES ('visão')";
$data = mysqli_query($dbc, $query) or die ('Não inseriu');
//ele acha os dados, mesmo o banco não salvando os acentos (WHERE funciona)
$query = " SELECT * FROM TESTE WHERE nome = 'visão' ";
$data = mysqli_query($dbc, $query);
$result = mysqli_fetch_array($data);
//ele exibe a palavra visão corretamente
echo $result['nome];
?>
Pelo que constatei ele sava errado no banco, mas qualquer operação no script funciona corretamente.
*** esse mesmo select com a o WHERE = 'visão' executado no workbench não funciona (ELE NÃO ENCONTRA DOS DADOS)
Informações:
collation default do schema é utf-8 general ci, assim como da tabela.
Alguém tem alguma sugestão de como posso resolver isso?
Obrigado pela resposta.
Estou iniciando o estudo com php e mysql e estou passando por esses erros iniciais, ja pesquisei bastante sobre esse erro e ja vi varias sugestoes.
Essa que você passou ja havia tentado e não funcionou.
Resolvi iniciar tudo do zero e compartilhar os passos, alguém encherga algum erro? ou falta fazer algo a mais para que o banco e aplicação fiquem padronizadas em utf-8?
1 - Criação do schema no mysql.
CREATE SCHEMA testedb DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 2 - Criação da tabela de teste.
CREATE TABLE `testedb`.`TESTETABLE` (
`cod` INT NOT NULL AUTO_INCREMENT,
`nome` VARCHAR(45) CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' NULL,
PRIMARY KEY (`cod`)); 3 - código da página php de testes.
<?php
header('Content-Type: text/html; charset=UTF-8');
define('DBHOST', 'localhost');
define('DBUSER', 'root');
define('DBPASS', 'justdoit');
define('DBNAME', 'testedb');
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<?php
$dbc = mysqli_connect(DBHOST, DBUSER, DBPASS, DBNAME)
or die('Não conectou ao banco');
$query = "INSERT INTO TESTETABLE (nome) VALUES ('visão')";
$data = mysqli_query($dbc, $query)
or die('Não executou inserção');
$query = "select * from TESTETABLE WHERE nome = 'visão'";
$data = mysqli_query($dbc, $query) or die('não executou select');
$result = mysqli_fetch_array($data);
echo $result['nome'];
?>
</body>
</html>
4- Resultados:No banco ele salvou visão; (tinha que salvar visão).
grato pela ajuda.
Se eu faço essa modificação no código utilizando utf8_decode para gravar a palavra 'visão'. E utilizando utf8_encode para mostrar a palavra visão a aplicação faz o que eu quero. Ela salva no banco 'visão' corretamente e mostra corretamente.
mas não existe um modo de fazer com que tudo opere em utf8 sem precisar ficar utilizando funções?
<?php
header('Content-Type: text/html; charset=UTF-8');
define('DBHOST', 'localhost');
define('DBUSER', 'root');
define('DBPASS', 'justdoit');
define('DBNAME', 'testedb');
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<?php
$dbc = mysqli_connect(DBHOST, DBUSER, DBPASS, DBNAME)
or die('Não conectou ao banco');
$valor = 'visão';
$valor = utf8_decode($valor);
$query = "INSERT INTO TESTETABLE (nome) VALUES ('visão')";
$data = mysqli_query($dbc, $query)
or die('Não executou inserção');
$query = "select * from TESTETABLE WHERE nome = 'visão'";
$data = mysqli_query($dbc, $query) or die('não executou select');
$result = mysqli_fetch_array($data);
echo utf8_encode($result['nome']);
?>
</body>
</html>
Bom, se para salvar corretamente eu tenho que usar utf8_decode.O manual do php diz o seguinte:
Esta função decodifica data, assumido ser codificada em UTF-8, para ISO-8859-1.
E na minha tabela o dado é mostrado corretamente, isso significa que minha tabela ta com collation ISO-8859-1? Mas no ato da criação eu defini utf8.
Problema parece ser na codificação do script ou conexão!
Para conexões com mysqli
//Orientado
$mysqli->set_charset("utf8");
//procedural
mysqli_set_charset($conn,"utf8");
http://php.net/manual/pt_BR/mysqli.set-charset.php
codificação no script
/applications/core/interface/imageproxy/imageproxy.php?img=http://i.imgur.com/uiV1zFH.png&key=e2f3709d00aab8c111baabf2ab8cd5033915f1ffca6126e5dad8f678dc9decc2" alt="uiV1zFH.png" />
>
Problema parece ser na codificação do script ou conexão!
Para conexões com mysqli
//Orientado
mysqli_set_charset($this->mysqli,"utf8");
//procedural
mysqli_set_charset($conn,"utf8");codificação no script
/applications/core/interface/imageproxy/imageproxy.php?img=http://i.imgur.com/uiV1zFH.png&key=e2f3709d00aab8c111baabf2ab8cd5033915f1ffca6126e5dad8f678dc9decc2" alt="uiV1zFH.png" />
Muito obrigado. Era a conexão!
Veja charset do html está em utf8 também, colocar no header da sua página o código abaixo.
Caso dê certo, padroniza seu banco com seu código
<?php header ('Content-type: text/html; charset=UTF-8'); ?>