2010-12-11 10 views
3

J'essaie de récupérer une ligne de la table qui contient la valeur Boris Borenović. Au lieu de cela, Boris Borenovi? est renvoyé.Les données MySQL contiennent des caractères spéciaux comme š et ć, mais ils sont affichés sous la forme '?' sur la page Web. Pourquoi?

Ma base de données et ma table MySQL ont tous deux un ensemble de classement utf8_unicode_ci.

Ma page PHP, qui affiche les données de la table, contient l'en-tête suivant: <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />. J'ai aussi essayé avec charset=utf-8, mais ça ne marche toujours pas.

La commande Sql que j'utilise pour interroger les données de la table est SELECT * FROM contact, donc rien de spécial là-bas, juste ennuyeux requête simple. J'ai essayé avec SELECT * FROM contact COLLATE Latin1_General_CI mais cette requête ne peut pas être exécutée.

Comment puis-je le faire fonctionner? Merci.

+0

Avez-vous changé jamais le charset des données déjà insérées? Vos champs dans la table sont également 'utf8'? Ce n'est pas si intelligent de sauvegarder des données dans la base de données comme UTF8 mais de travailler avec le jeu de caractères ISO-8859-1 sur la page elle-même. Essayez de mettre votre texte dans 'htmlentities()' et publiez les résultats ici! – thedom

+0

vous devrez combiner les réponses @costis et @Ioannis Karadimas pour que cela fonctionne. UTF-8 est le chemin à parcourir pour toutes vos données (utf8 db, utf8 meta charset, connexion utf8 mysql) –

+0

mon collation de base de données et de connexion ainsi que l'encodage de la page sont tous mis à utf8. Je vois toujours les points d'interrogation stupides et ça me rend un peu frustré. – Boris

Répondre

0
<?php 

    $mysql_host = "localhost"; 

    $mysql_db = "database"; 
    $mysql_user = "username"; 
    $mysql_pass = "password"; 

    $mysql_character = "latin1"; 
    $mysql_collate = "latin1_bin"; 

    $db = mysql_connect($mysql_host, $mysql_user, $mysql_pass); 
    if(!$db) echo "Cannot connect to the database!"; 

    mysql_select_db($mysql_db); 
    mysql_query("ALTER DATABASE `".$mysql_db."` DEFAULT CHARACTER SET '".$mysql_character."' COLLATE '".$mysql_collate."'"); 
    $query = mysql_query("SHOW TABLES"); 
    while($row = mysql_fetch_array($query)) { 
    $table = $row[0]; 
    mysql_query("ALTER TABLE `".$table."` DEFAULT CHARACTER SET '".$mysql_character."' COLLATE '".$mysql_collate."'"); 

    $query2 = mysql_query("SHOW columns FROM `".$table."`"); 
    while($row = mysql_fetch_array($query2)) { 
     $column = $row[0]; 
     $type = $row[1]; 
     $null = $row[2]; 
     if($null == "YES") $null = "NULL"; 
     if($null == "NO") $null = "NOT NULL"; 
     mysql_query("ALTER TABLE `".$table."` CHANGE COLUMN `".$column."` `".$column."` ".$type." CHARACTER SET '".$mysql_character."' COLLATE '".$mysql_collate."' ".$null); 
    } 
    } 

?> 
1

Voici la réponse: can't insert russian text into mysql database Vous devez configurer MySQL pour permettre utf-8

+0

La question indique que l'OP voit les caractères appropriés dans la base de données. Donc le problème n'est pas avec les inserts ni avec la table elle-même. – BalusC

+0

correct BalusC, tout va bien dans la DB. le problème est situé dans la page php. – Boris

1

Avez-vous mis votre collation de connexion? Essayez d'exécuter SET NAMES utf8 pour définir tous les classements sur utf-8, puis définissez votre jeu de caractères sur utf-8 avant d'exécuter l'instruction select.

+0

Si c'était la seule cause, alors l'OP aurait probablement vu 'Å¡' au lieu de'? 'Pour un' š'. – BalusC

+0

je suis bien là, mon collation de connexion est utf8 – Boris

0

Votre base de données est parfaitement bien. Si vous voyiez ? dans la base de données elle-même, cela aurait signifié que l'encodage de la table de base de données est faux.

Comme vous voyez ? dans la réponse HTTP, cela signifie que PHP n'a pas reçu l'instruction d'écrire des caractères comme UTF-8 dans la réponse. Vérifiez l'étape 3 de cette PHP UTF-8 cheatsheet.

Si vous voyez alors par exemple Å¡ au lieu de š, alors vous devez exécuter mysql_set_charset avec utf8 avant la SELECT ainsi.

+0

Merci pour la réponse, BalusC. J'ai changé le fichier php.ini selon l'étape 3 dans les instructions, mais l'erreur reste la même. D'autres idées? – Boris

+0

Avez-vous également installé mbstring? Voir l'étape 2. Désolé de ne pas le mentionner directement dans la réponse. – BalusC

0

Mon chemin est:

mysql_query("SET CHARACTER SET 'utf8'"); 
mysql_query("SET NAMES 'UTF8'"); 
mysql_query("SET CHARACTER SET_CLIENT='UTF8'"); 

Mettre ce code après la connexion sur la base de données

(mysql_select_db($Database);)

+0

il doit exécuter cela sur chaque champ, table et base de données – transilvlad