Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL et PHP :UTF-8 avec caractères cyrilliques

Vous mélangez des API ici, mysql_* et mysqli_* ne se mélange pas. Vous devriez vous en tenir à mysqli_ (comme il semble que vous l'êtes de toute façon), comme mysql_* les fonctions sont obsolètes et entièrement supprimées dans PHP7.

Votre problème réel est un problème de jeu de caractères quelque part. Voici quelques conseils qui peuvent vous aider à obtenir le bon jeu de caractères pour votre application. Cela couvre la plupart des problèmes généraux auxquels on peut être confronté lors du développement d'une application PHP/MySQL.

  • TOUS les attributs de votre application doivent être définis sur UTF-8
  • Enregistrez le document au format UTF-8 sans BOM (si vous utilisez Notepad++, c'est Format -> Convert to UTF-8 w/o BOM )
  • L'en-tête en PHP et HTML doit être défini sur UTF-8

    • HTML (à l'intérieur de <head></head> balises) :

      <meta charset="UTF-8">
      
    • PHP (en haut de votre fichier, avant toute sortie) :

      header('Content-Type: text/html; charset=utf-8');
      
  • Lors de la connexion à la base de données, définissez le jeu de caractères sur UTF-8 pour votre objet de connexion, comme ceci (directement après la connexion)

    mysqli_set_charset($conn, "utf8"); /* Procedural approach */
    $conn->set_charset("utf8");        /* Object-oriented approach */
    

    Ceci est pour mysqli_* , il en existe des similaires pour mysql_* et AOP (voir en bas de cette réponse).

  • Assurez-vous également que votre base de données et vos tables sont définies sur UTF-8, vous pouvez le faire comme ceci :

    ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    

    (Toutes les données déjà stockées ne seront pas converties dans le jeu de caractères approprié, vous devrez donc le faire avec une base de données propre ou mettre à jour les données après cela s'il y a des caractères cassés).

  • Si vous utilisez json_encode() , vous devrez peut-être appliquer le JSON_UNESCAPED_UNICODE flag, sinon il convertira les caractères spéciaux en leur équivalent hexadécimal.

N'oubliez pas que TOUT dans l'ensemble de votre pipeline de code doit être défini sur UFT-8, sinon vous risquez de rencontrer des caractères brisés dans votre application.

En plus de cette liste, il peut y avoir des fonctions qui ont un paramètre spécifique pour spécifier un jeu de caractères. Le manuel vous en parlera (un exemple est htmlspecialchars() ).

Il existe également des fonctions spéciales pour les caractères multi-octets, exemple :strtolower() ne diminuera pas les caractères multi-octets, pour cela vous devrez utiliser mb_strtolower() , regardez cette démo en direct .

Remarque 1 :Notez que c'est noté quelque part comme utf-8 (avec un tiret), et quelque part comme utf8 (sans ça). Il est important que vous sachiez quand utiliser lequel, car ils ne sont généralement pas interchangeables. Par exemple, HTML et PHP veulent utf-8 , mais pas MySQL.

Remarque 2 :Dans MySQL, "charset" et "collation" ne sont pas la même chose, voir Différence entre l'encodage et la collation ? . Les deux doivent cependant être définis sur utf-8 ; généralement, le classement doit être soit utf8_general_ci ou utf8_unicode_ci , voir UTF-8 :général ? Poubelle? Unicode ? .

Remarque 3  :Si vous utilisez des emojis, MySQL doit être spécifié avec un utf8mb4 charset au lieu du standard utf8 , à la fois dans la base de données et dans la connexion. HTML et PHP auront juste UTF-8 .

Configurer UTF-8 avec mysql_ et AOP

  • AOP :Cela se fait dans la DSN de votre objet. Notez le charset attribut,

    $pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8", "user", "pass");
    
  • mysql_ :Cela se fait de manière très similaire à mysqli_* , mais il ne prend pas l'objet de connexion comme premier argument.

    mysql_set_charset('utf8');