PHP 8.3.4 Released!

Jeux de caractères

Idéalement, un jeu de caractères propre doit être défini au niveau du serveur, opération décrite dans la section » Configuration du jeu de caractères du manuel MySQL Server. Alternativement, chaque API MySQL offre une méthode pour définir le jeu de caractères lors de l'exécution.

Attention

Le jeu de caractères et l'échappement des caractères

Le jeu de caractères doit être compris et défini, sachant qu'il a un effet sur chaque action, et a des implications au niveau de la sécurité. Par exemple, le mécanisme d'échappement (i.e. mysqli_real_escape_string() pour mysqli, et PDO::quote() pour PDO_MySQL) va utiliser cette configuration. Il est important de garder en tête que ces fonctions n'utiliseront pas le jeu de caractères défini avec une requête, aussi, l'exemple suivant n'aura aucun effet sur le jeu de caractères :

Exemple #1 Problèmes lors de la définition du jeu de caractères avec SQL

<?php

$mysqli
= new mysqli("localhost", "my_user", "my_password", "world");

// N'affectera PAS $mysqli->real_escape_string();
$mysqli->query("SET NAMES utf8mb4");

// N'affectera PAS $mysqli->real_escape_string();
$mysqli->query("SET CHARACTER SET utf8mb4");

// Mais, ceci affectera $mysqli->real_escape_string();
$mysqli->set_charset('utf8mb4');

// Mais, ceci NE l'affectera PAS (UTF-8 par rapport à utf8mb4) -- n'utilisez pas les tirets ici
$mysqli->set_charset('UTF-8');
?>

Ci-dessous les exemples qui démontrent la façon de modifier proprement le jeu de caractères lors de l'exécution en utilisant chacune des APIs.

Note: Confusion possible avec UTF-8

Du au fait que les noms des jeux de caractères dans MySQL ne contiennent pas de tiret, la chaîne "utf8" est correcte dans MySQL et définira le jeu de caractère en UTF-8. La chaîne "UTF-8" n'est pas correcte, et utiliser "utf-8" échouera à modifier le jeu de caractère.

Exemple #2 Exemple de définition du jeu de caractères : mysqli

<?php
$mysqli
= new mysqli("localhost", "my_user", "my_password", "world");

echo
'Jeu de caractère initial : ' . $mysqli->character_set_name() . "\n";

if (!
$mysqli->set_charset('utf8mb4')) {
printf("Erreur lors du chargement du jeu de caractères utf8mb4 : %s\n", $mysqli->error);
exit;
}

echo
'Votre jeu de caractère actuel est : ' . $mysqli->character_set_name() . "\n";
?>

Exemple #3 Exemple de définition du jeu de caractères : pdo_mysql

<?php
$pdo
= new PDO("mysql:host=localhost;dbname=world;charset=utf8mb4", 'my_user', 'my_pass');
?>
add a note

User Contributed Notes 3 notes

up
21
mkroese at eljakim dot nl
6 years ago
Please note that MySQL's utf8 encoding has a maximum of 3 bytes and is unable to encode *all* unicode characters.

If you need to encode characters beyond the BMP (Basic Multilingual Plane), like emoji or other special characters, you will need to use a different encoding like utf8mb4 or any other encoding supporting the higher planes. Mysql will discard any characters encoded in 4 bytes (or more).

See https://dev.mysql.com/doc/refman/5.7/en/charset-unicode-utf8mb4.html for more information on the matter
up
-1
legrand dot jeremie at gmail dot com
1 year ago
After setting the charset, you should define the 'collation' too, to give information on how sorting results on requests. By default, it is 'utf8mb4_general_ci', which is a simplified set of sorting rules. For the official rules, edicted by Unicode, it should be 'utf8mb4_unicode_ci'.

For example:
\mysqli_set_charset($hdl, 'utf8mb4');
\mysqli_query($hdl, 'SET collation_connection = utf8mb4_unicode_520_ci');
up
-49
go at NOSPAMME dot quidera dot com
11 years ago
If none of the character set alterations work and the data is valid UTF8 and is garbled when saved in mysql. Then your table is not supporting UTF8 and likely is Latin1 or something else. So you will need to update you table, in the case of MySQL do the following:

ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8;
To Top