Mysql2 :: Erreur: valeur de chaîne incorrecte

J’ai une application de rails fonctionnant en mode production, mais soudainement, cette erreur est apparue quand un utilisateur a essayé de sauvegarder un enregistrement.

Mysql2::Error: Incorrect ssortingng value 

Plus de détails (à partir du journal de production):

 Parameters: {"utf8"=>"â" ... Mysql2::Error: Incorrect ssortingng value: '\xC5\x99\xC3\xA1k Mysql2::Error: Incorrect ssortingng value: '\xC5\x99\xC3\xA1k 

Maintenant, j’ai vu certaines solutions nécessitant de déposer les bases de données et de les recréer, mais je ne peux pas le faire.

Maintenant, mysql montre ceci:

 mysql> show variables like 'char%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | 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/ | +--------------------------+----------------------------+ 8 rows in set (0.04 sec) 

Qu’est-ce qui ne va pas et comment puis-je le changer pour que je n’aie aucun problème avec les personnages?

Aussi: Ce problème est-il résolu avec javascript? Convertissez-le avant de l’envoyer?

Merci

le problème est causé par charset de votre serveur mysql. Vous pouvez configurer manuellement comme:

 ALTER TABLE your_database_name.your_table CONVERT TO CHARACTER SET utf8 

ou laisser tomber la table et la recréer comme:

 rake db:drop rake db:create rake db:migrate 

les références:

https://stackoverflow.com/a/18498210/2034097

https://stackoverflow.com/a/16934647/2034097

METTRE À JOUR

la première commande n’affecte que la table spécifiée, si vous souhaitez modifier toutes les tables d’une firebase database, vous pouvez faire comme

 ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_general_ci; 

référence:

https://stackoverflow.com/a/6115705/2034097

J’ai réussi à stocker des emojis (qui prennent 4 octets) en suivant cet article :

Rails 4, MySQL et Emoji ( Mysql2::Error: Incorrect ssortingng value error. )

Vous pourriez penser que vous êtes sûr d’insérer la plupart des données utf8 dans mysql lorsque vous avez spécifié que le jeu de caractères est utf-8 . Malheureusement, vous auriez tort. Le problème est que le jeu de caractères utf8 occupe 3 octets lorsqu’il est stocké dans une colonne VARCHAR. Les caractères Emoji, quant à eux, occupent 4 octets .

La solution est en 2 parties:

Changez l’encodage de votre table et de vos champs:

 ALTER TABLE `[table]` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin, MODIFY [column] VARCHAR(250) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin 

Dites à l’adaptateur mysql2 :

 development: adapter: mysql2 database: db username: password: encoding: utf8mb4 collation: utf8mb4_unicode_ci 

J’espère que cela aide quelqu’un!

Ensuite, j’ai dû redémarrer mon application et cela a fonctionné. Veuillez noter que certains émoticons fonctionneront sans ce correctif, tandis que d’autres ne le feront pas:

  • ➡️ a travaillé
  • 🔵 N’a pas fonctionné avant d’avoir appliqué le correctif décrit ci-dessus.

Vous pouvez utiliser une migration comme celle-ci pour convertir vos tables en utf8:

 class ConvertTablesToUtf8 < ActiveRecord::Migration def change_encoding(encoding,collation) connection = ActiveRecord::Base.connection tables = connection.tables dbname =connection.current_database execute <<-SQL ALTER DATABASE #{dbname} CHARACTER SET #{encoding} COLLATE #{collation}; SQL tables.each do |tablename| execute <<-SQL ALTER TABLE #{dbname}.#{tablename} CONVERT TO CHARACTER SET #{encoding} COLLATE #{collation}; SQL end end def change reversible do |dir| dir.up do change_encoding('utf8','utf8_general_ci') end dir.down do change_encoding('latin1','latin1_swedish_ci') end end end end 

Besoin de changer CHARACTER SET et COLLATE pour la firebase database déjà créée:

 ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

Ou il était nécessaire de créer une firebase database avec des parameters prédéfinis:

 CREATE DATABASE databasename CHARACTER SET utf8 COLLATE utf8_general_ci; 

Si vous voulez stocker des emoji, vous avez besoin de:

1) Créer une migration (merci @mfazekas)

 class ConvertTablesToUtf8 < ActiveRecord::Migration def change_encoding(encoding,collation) connection = ActiveRecord::Base.connection tables = connection.tables dbname =connection.current_database execute <<-SQL ALTER DATABASE #{dbname} CHARACTER SET #{encoding} COLLATE #{collation}; SQL tables.each do |tablename| execute <<-SQL ALTER TABLE #{dbname}.#{tablename} CONVERT TO CHARACTER SET #{encoding} COLLATE #{collation}; SQL end end def change reversible do |dir| dir.up do change_encoding('utf8mb4','utf8mb4_bin') end dir.down do change_encoding('latin1','latin1_swedish_ci') end end end end 

2) Changer le jeu de caractères des rails en utf8mb4 (merci @ selvamani-p)

 production: encoding: utf8mb4 

Les références:

https://stackoverflow.com/a/39465494/1058096

https://stackoverflow.com/a/26273185/1058096

Cela semble être un problème de codage lors de l’obtention de données à partir d’une firebase database. Essayez d’append le fichier ci-dessous à votre fichier database.yml

  encoding: utf8 

J’espère que cela résout votre problème

De plus, si vous ne souhaitez pas apporter de modifications à la structure de votre firebase database, vous pouvez choisir de sérialiser le champ en question.

 class MyModel < ActiveRecord::Base serialize :content attr_accessible :content, :title end