2010-04-30 9 views
0

J'essaie de stocker une liste de pays dans une base de données mySQL.Quel collation dois-je utiliser pour stocker ces noms de pays dans MySQL?

Je rencontre des problèmes de stockage des noms (non anglais) comme ceux-ci:

  • São Tomé et Príncipe
  • República de El Salvador

Ils sont stockés avec des personnages étranges dans le db, (et donc sortie étrangement dans mes pages HTML).

J'ai essayé d'utiliser différentes combinaisons de la base de données pour les classements et la collecte de connexion MySQL:

Le réglage « évident » utf8_unicode_ci devait utiliser tant pour le databse et les informations de connexion. À ma grande surprise, cela n'a pas résolu le problème.

Est-ce que quelqu'un sait comment résoudre ce problème?

[Modifier]

Il se trouve que le problème est de ne pas faire avec collation, mais le codage, comme l'a fait par le col. Je remarque que la ligne de commande, je peux taper deux commandes séparées:

SET NAMES utf8 

followed by 

[QUERY] 

où [QUERY] est mon requête SQL pour récupérer les noms, et qui fonctionne (les noms ne sont plus mutilée). Cependant, lorsque je fais la même chose par programmation (c'est-à-dire par code), je reçois toujours les noms mutilés. J'ai essayé de combiner les deux déclarations comme ceci:

SET NAMES utf8; [QUERY] 

à la ligne de commande, encore une fois, ce sont retournés les chaînes correctes. Encore une fois, lorsque j'ai essayé les mêmes déclarations à l'aide du code, j'ai eu de fausses valeurs.

C'est un extrait de ce que mon code ressemble à:

$mysqli = self::get_db_connection(); 
$mysqli->query('SET NAMES utf8'); 

$sql = 'SELECT id, name FROM country'; 

$results = self::fetch($sql); 

the fetch method is: 

    private static function fetch($query) 
    { 
     $rows = array(); 

     if (!empty($query)) 
     { 
      $mysqli = self::get_db_connection(); 

      if ($mysqli->connect_errno) 
      { 
       self::logError($mysqli->connect_error); 
      } 
      else 
      { 
       if ($result = $mysqli->query($query)) 
       { 
        if(is_object($result)){ 
         while ($row = $result->fetch_array(MYSQLI_ASSOC)) 
          $rows[] = $row; 
         $result->close(); 
        } 
       } 
      } 
     } 
    return $rows; 
    } 

Quelqu'un peut-il repérer ce que je peux être en train de faire des thats mal?

Juste pour clarifier, les en-têtes HTTP dans la page sont réglés correctement 'Content-type': 'text/html; charset = utf-8 '

donc ce n'est pas le problème ici.

+1

êtes-vous sûr qu'il didn pas résoudre le problème? Avez-vous vérifié que votre entrée était encodée correctement? – aioobe

Répondre

1

En fait, collation n'affecte rien. c'est une chose utilisée pour la commande et la comparaison, pas pour le recodage. Il s'agit du encoding responsable des caractères lui-même.

Donc, votre problème ne vient pas de la collation de table, mais à partir du codage de connexion

SET NAMES utf8 

requête doit résoudre le problème, à leas pour les nouvelles données insérées

+0

@col: ok, maintenant devenait chaud ... – morpheous

1

si vous utilisez UF8 partout *, cela fonctionnera - semble que vous avez oublié quelque chose

* signifie partout: pour votre base de données collation et -connection, pour vos fichiers de script (php?) Et pour les pages qui sont envoyés au navigateur (en définissant un méta-tag ou, mieux, définir un uftf-8-header)

+0

Je mettrais aussi "accept-charset = 'UTF-8'" dans l'étiquette de formulaire. – aioobe

+0

pas besoin, @aioobe. L'encodage de la page défini par l'en-tête est suffisant. –

+0

ok, donc si j'envoie la page dans utf8, le navigateur est garanti pour répondre dans post-données possibles dans utf8? – aioobe