Nous avons récemment migré sur un nouveau serveur avec PHP 7 et une nouvelle version MySQL. Une erreur est alors apparue : une erreur "incorrect string value" lorsqu'on essayait d'enregistrer un texte avec des accents codés sur 2 caractères (à chaque fois le texte était écrit sur Mac puis copier / coller dans un formulaire sur le site).
Explication : le champs texte de la BDD avait été déclaré avec un interclassement "latin1_swedish_ci" (interclassement par défaut sur l'ancienne base de donnée). La nouvelle version de MySQL étant beaucoup plus sensible, ça ne passe pas et ça plante avec une erreur "incorrect string value".
La solution : il faut passer les champs texte avec un interclassement "utf8_general_ci" (et évidemment passer l'ensemble du traitement en utf8 (HTML, PHP, javascript, ...)
Le problème : il n'est pas toujours possible de modifier l'interclassement d'une base de donnée sans mettre en péril une partie des données. Si vous ne pouvez pas modifier l'interclassement voici une solution intermédiaire qui permet de virer les caractères parasites avant l'enregistrement dans la base de donnée.
Explication : le champs texte de la BDD avait été déclaré avec un interclassement "latin1_swedish_ci" (interclassement par défaut sur l'ancienne base de donnée). La nouvelle version de MySQL étant beaucoup plus sensible, ça ne passe pas et ça plante avec une erreur "incorrect string value".
La solution : il faut passer les champs texte avec un interclassement "utf8_general_ci" (et évidemment passer l'ensemble du traitement en utf8 (HTML, PHP, javascript, ...)
Le problème : il n'est pas toujours possible de modifier l'interclassement d'une base de donnée sans mettre en péril une partie des données. Si vous ne pouvez pas modifier l'interclassement voici une solution intermédiaire qui permet de virer les caractères parasites avant l'enregistrement dans la base de donnée.
Code PHP (pour une page HTML codée en UTF8)
function unikode($txt)
{
$txt = htmlentities($txt);
$txt = mb_convert_encoding($txt,'ISO-8859-2');
$txt = html_entity_decode($txt);
return ($txt);
}