8722 sujets

Développement web côté serveur, CMS

Bonjour à tous
Je suis en train de migrer des données qui sont dans un fichier XML vers une base de données.
Je reçois le message d'erreur suivant de MySQL:

Incorrect string value: '\xE2\x80\x89-\xE2\x80...' for column 'transports' at row 1

La raison est claire: il s'agit d'un caractère "thin-space" qui n'est pas supporté, ainsi que d'autres caractères de la même table UTF-8
Ma question: comment repérer ces caractères dans une chaîne de caractères et les remplacer par des caractères moins "touchy", dans ce cas un simple " " serait suffisant.
Modérateur
Bonjour,

Tout dépend du charset que tu utilises !

Certains charsets dits "utf8" ne supportent que des caractères codés sur au plus 3 octets (on parle alors de "utfmb3"). Certains autres charsets supportent les caractères codés sur 4 octets (on parle alors de "utfmb4").

En fait, un caractère en utf8 peut même être codé sur 6 octets.

Selon moi, tu ferais de faire en sorte que ta base supporte au moins les caractères codés sur 4 octets.

Après, ce qui est bizarre ici, c'est que le "thin-space" semble être codé sur 3 octets, et donc ça devrait passer tranquille.

Amicalement,
Merci de ta réponse
Je connaissais ce truc: quand je travaillais chez Oracle on s'est rendu compte de ce genre de problème lors de la première installation d'une application au Japon (outre que les varchar étaient trop petits)
J'ai bien essayé de passer la base en utfmb4, mais c'est une base créée par mon hébergeur, je n'ai pas vraiment la main sur ses caractéristiques et je n'ai pas trouvé comment faire.
Pour le moment j'ai réussi à faire des Find/Replace de ce caractère (et de quelques autres) dans les données qui servent à générer les fichiers xml, il n'y en a pas beaucoup, ça semble fonctionner.
Le contexte: il s'agit d'une liste de lieux où nous nous réunissons pour des répétitions, concerts, stages et autres. Il m'est arrivé souvent de faire des copier/coller des adresses géographiques depuis les sites web correspondant à ces lieux, je n'avais même pas remarqué que ces caractères étaient utilisés dans certains sites.
J'ai fini par trouver le pourquoi du comment:
La table est générée par l'hébergeur avec latin_general_ci comme interclassement. Pour avoir utf8_general_ci il faut le préciser à chaque création de table et de champ. Si on oublie de le faire, ça reste en latin_general_ci.
Dans ce cas là, même si on dit à pdo que l'interface est en utf8, la base de données refuse les caractères qui ne sont pas inclus dans latin_general_ci