J'ai une application Rails. Parfois, lorsqu'un utilisateur écrit dans un champ de texte et qu'une requête est exécutée pour mettre à jour ce champ dans la base de données MySQL, j'obtiens le journal des erreurs suivant:
UPDATE boats SET description = 'Vivez l'expérience única de navigation dans un bateau à moteur de plongée dans le comté de Mako. Te emocionará. ', Updated_at =' 2015-03-10 20:10:32 'WHERE boats.id = 1
E, [2015-03-10T20:10:32.223430 #20343] ERROR -- : Mysql2::Error: Incorrect string value: '\xE2\x80\xA8\x09Te...' for column 'description' at row 1: UPDATE boats SET description = 'Vive la experiencia única de navegar abordo de un clásico de madera de lujo como Mako.
Te emocionará.', updated_at = '2015-03-10 20:10:32' WHERE boats.id = 1
Remarque: Désolé, je ne suis pas en mesure de mettre le code ci-dessus en tant que code. Il doit y avoir un caractère spécial.
Je voudrais que l'utilisateur puisse ajouter n'importe quel caractère sans erreur.
J'ai un environnement de développement et de production. L'erreur ne se produit qu'en production.
J'ai vu ce post qui ressemble au même problème que le mien: Mysql2 :: Error: valeur de chaîne incorrecte
J'exécute cette requête show variables like 'char%';
pour vérifier le caractère de la base de données config et: Development:
'character_set_client', 'utf8'
'character_set_connection', 'utf8'
'character_set_database', 'utf8'
'character_set_filesystem', 'binary'
'character_set_results', 'utf8'
'character_set_server', 'utf8'
'character_set_system', 'utf8'
'character_sets_dir', '/usr/local/Cellar/mysql/5.6.19/share/mysql/charsets/'
Production:
'character_set_client', 'utf8'
'character_set_connection', 'utf8'
'character_set_database', 'latin1'
'character_set_filesystem', 'binary'
'character_set_results', 'utf8'
'character_set_server', 'latin1'
'character_set_system', 'utf8'
'character_sets_dir', '/usr/share/mysql/charsets/'
J'ai donc exécuté ALTER DATABASE yanpyprod CHARACTER SET utf8 COLLATE utf8_general_ci;
pour mettre à jour le jeu de caractères de la base de données sur utf8.
Cependant, après le changement du jeu de caractères en utf8, j'obtiens toujours la même erreur.
Cela fonctionne si vous exécutez ALTER TABLE your_database_name.your_table CONVERT TO CHARACTER SET utf8
au lieu de la requête pour mettre à jour le jeu de caractères dans la base de données ci-dessus.
La solution est le poste ci-joint, à la toute fin.
Si vous devez conserver le jeu de caractères par défaut de la table, vous pouvez modifier le ou les champs spécifiques qui posent problème.
J'ai le même problème avec deux champs dans une table, et ces champs stockent le contenu à partir de valeurs de champs de texte enrichi. Ces champs sont utilisés pour entrerHRMLainsi que certains contenus à l’origine de l’erreur.
Ainsi, si le problème concerne uniquement un champ ou un ensemble de champs, vous pouvez définir le jeu de caractères de ce champ spécifique. Le type de requête ALTER suivant peut être utilisé pour définir le jeu de caractères d'un champ.
ALTER TABLE your_db_name.table_name MODIFY COLUMN column_name text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;
REMARQUE: Mettez à jour les noms et les valeurs pertinents en fonction de vos besoins et de votre environnement. La seule chose à souligner ici est CHARACTER SET utf8