web-dev-qa-db-fra.com

Définir le jeu de caractères à l'aide de MySQLi

Je récupère des données en arabe à partir de tables MySQL avec MySQLi. Donc, j'utilise généralement ceci dans un style procédural:

mysql_query("SET NAMES 'utf8'"); 
mysql_query('SET CHARACTER SET utf8'); 

Maintenant, j'utilise le style OOP donc j'essaie de voir s'il y a quelque chose que je pourrais définir plutôt que ce qui précède?

Je n'ai trouvé cela que dans PHP manual alors je l'ai fait, mais qu'en est-il de la définition des noms en UTF8?

$mysqli->set_charset("utf8");
15
sys_debug

C'est le même:

$ mysqli-> query ("SET NAMES 'utf8'");

Dans le manuel:

C'est le moyen préféré de modifier le jeu de caractères. L'utilisation de mysqli :: query () pour exécuter SET NAMES .. n'est pas recommandée.

$mysqli->set_charset("utf8"); suffit, laissez le pilote mysqli db faire la chose pour vous.

23
xdazz

Tu devrais utiliser

$mysqli->set_charset("utf8");

N'utilisez pas explicitement SET NAMES Ou SET CHARACTER SET Lorsque vous utilisez MySQLi. Et n'utilisez certainement pas les deux comme le demandeur était ici à l'origine. Raisons pour lesquelles c'est une mauvaise idée:

  • Appeler SET CHARACTER SET utf8 Après SET NAMES utf8 En fait juste annule une partie du travail qui SET NAMES did .
  • Le manuel PHP nous avertit explicitement d'utiliser mysqli_set_charset, Pas SET NAMES:

    Il s'agit de la méthode préférée pour modifier le jeu de caractères. Utiliser mysqli_query () pour le définir (comme SET NAMES utf8) n'est pas recommandé. Voir la section Concepts du jeu de caractères MySQL pour plus d'informations.

  • Sous le capot, mysqli_set_charset Est juste un wrapper pour mysql_set_character_set de l'API MySQL C (ou son équivalent mysqlnd). En regardant les documents pour cette fonction , nous pouvons voir la différence entre elle et SET NAMES:

    Cette fonction fonctionne comme l'instruction SET NAMES, Mais définit également la valeur de mysql->charset, Et affecte donc le jeu de caractères utilisé par mysql_real_escape_string()

    En d'autres termes, $mysqli->set_charset('foo') fera tout ce que SET NAMES foo Fait et aussi s'assurera que mysqli_real_escape_string Respecte le nouvel encodage. Certes, si vous utilisez uniquement des encodages comme Latin 1 et UTF 8 qui étendent strictement ASCII (c'est-à-dire, qui encodent toutes les chaînes ASCII exactement comme elles le feraient) être encodé en ASCII), puis utiliser SET NAMES au lieu de set_charset ne cassera rien. Cependant, si vous utilisez des encodages plus inhabituels comme GBK, vous pourriez finir par brouiller vos chaînes ou même en introduisant vulnérabilités d'injection SQL qui contournent mysqli_real_escape_string .

Il est donc recommandé de n'utiliser que set_charset, Pas SET NAMES. Il n'y a rien que SET NAMES Fait que set_charset Ne fait pas, et set_charset Évite le risque que mysqli_real_escape_string Se comporte de manière incorrecte (ou même de manière non sécurisée).

13
Mark Amery

Vous pouvez l'utiliser. C'est vraiment bien pour le jeu de caractères mysqli

$dbhost     = "localhost";
$dbuser     = "root";
$dbpass     = "dbpass";
$dbname     = "dbname";

$conn = mysqli_connect($dbhost,$dbuser,$dbpass,$dbname);
mysqli_query($conn,"SET CHARACTER SET 'utf8'");
mysqli_query($conn,"SET SESSION collation_connection ='utf8_unicode_ci'");
8
Obaidul Haque

Pour les amateurs de style procédural.

// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);

/* change character set to utf8 */
mysqli_set_charset($conn,"utf8");
1
AMB