L'insertion de l'UTF-8 chaîne encodée en UTF-8 table mysql échoue avec Incorrecte “chaîne de valeur”
De l'insertion de l'UTF-8 chaîne encodée en UTF-8 tableau donne incorrecte de la chaîne de valeur.
PDOException: SQLSTATE[HY000]: General error: 1366 Incorrecte de la chaîne de valeur: '\xF0\x9D\x84\x8E je...' pour la colonne 'body_value' à la ligne 1: INSERT INTO
J'ai un caractère dans une chaîne mb_detect_encoding revendications est codé en UTF-8.
J'essaie d'insérer cette chaîne de caractères dans une table MySQL, qui est défini comme (entre autres choses) DEFAULT CHARSET=utf8
Edit: Drupal fait toujours SET NAMES utf8
avec, en option, COLLATE
(au moins lorsque l'on parle de MySQL).
Edit 2: peu plus en détails qui semblent pertinents. Je prends un peu de texte à partir d'une base de données PostgreSQL. Je le coller sur un objet, utilisez mb_detect_encoding pour vérifier que c'est de l'UTF-8, et à la persistance de l'objet à la base de données, à l'aide de node_save. Ainsi, alors que il y a une requête HTTP qui déclenche l'importation, les données ne vient pas du navigateur.
Edit 3: de Données est dénormalisé sur deux tableaux:
SÉLECTIONNEZ character_set_name DE information_schema.
COLUMNS
C OÙ table_schema = "[base de données]" ET table_name DANS ("field_data_body", "field_revision_body") ET column_name = "body_value";
>+--------------------+
| character_set_name |
+--------------------+
| utf8 |
| utf8 |
+--------------------+
Edit 4: Est-il possible que le personnage est "à nouveau"? Je suis plus que un peu floue sur la relation entre unicode et UTF-8, mais ce article de wikipedia, implique que le personnage a été normalisée à très récemment.
Je ne comprends pas comment cela peut échouer avec Incorrecte "chaîne de valeur".
- Est le champ dans la table définie avec un encodage UTF-8 charset?
- double possible de UTF-8 Problème de Base de données
- Ce n'
SELECT character_set_name FROM information_schema.`COLUMNS` C WHERE table_schema = "db_name" AND table_name = "table_name" AND column_name = "column_name";
donner - MySQL
utf8
n'est que le BMP. Sonutf8mb4
correspond à l'extérieur du mondeUTF-8
(et comprend 4 octets). - L'erreur est provoquée par essayer de caser 4 octets dans un jeu de caractères qui ne peut pas le manipuler (à savoir MySQL "utf8").
Vous devez vous connecter pour publier un commentaire.
(U+1D10E) est un caractère Unicode trouve en dehors de la BMP (Basic Multilingual Plane) (au-dessus de U+FFFF) et ne peut donc pas être représentée en UTF-8 dans les 3 octets. MySQL charset utf8 accepte uniquement les caractères UTF-8 si elles peuvent être représentées dans les 3 octets. Si vous avez besoin de les stocker dans le serveur MySQL, vous aurez besoin d'utiliser MySQL charset utf8mb4. Vous aurez besoin de MySQL 5.5.3 ou plus tard. Vous pouvez utiliser l'instruction ALTER TABLE pour changer le jeu de caractères sans trop de problème; depuis qu'il a besoin de plus d'espace pour stocker les personnages, un couple de questions montrent que peuvent vous obliger à réduire la taille de la chaîne. Voir http://dev.mysql.com/doc/refman/5.5/en/charset-unicode-upgrading.html .
pour résoudre ce problème, il faut d'abord changer votre champ de base de données à utf8m4b charset. Par exemple:
ensuite dans votre base de données de connexion, définissez driver_options pour utf8mb4. Par exemple, si vous utilisez PDO
ou dans zend framework 1.2
Dans votre AOP connecton, définir le jeu de caractères.
<HEAD>
contient<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
, mais pas de données à partir du navigateur. (J'ai mis à jour la question avec plus de données, de nouveau)utf8mb4
, pas seulementutf8
. (J'ai édité la réponse.)