web-dev-qa-db-fra.com

L'importation de MySQL 5.7.12 ne peut pas créer une valeur JSON à partir d'une chaîne avec CHARACTER SET 'binary'

J'ai exporté ma base de données avec des colonnes JSON. Après avoir migré vers un nouveau serveur, mon import s'est bloqué à chaque fois avec une erreur telle que:

ne peut pas créer une valeur JSON à partir d'une chaîne avec CHARACTER SET 'binary'

Sur stackoverflow, j'ai trouvé ce billet mais ne m'a pas fonctionné: mysqlimport questions "set @@ character_set_database = binary", ce qui empêche de charger des valeurs json

Le fichier fait 2Go et il n'est pas possible de l'ouvrir.

Quelqu'un a une idée pour importer mon fichier de base de données?

29
Danny Bevers

Toutes les informations de type de données MySQL JSON doivent être des jeux de caractères UTF8MB4 et non BINARY.

0
David Stokes

Vous pouvez appliquer une expression rationnelle au texte SQL que vous avez exporté, ce qui convertira vos chaînes binaires en un format pouvant être inséré. C'était ma solution rapide et sale quand j'ai fait face à ce problème

(X'[^,\)]*')
CONVERT($1 using utf8mb4)

Appliquer ce regex signifie

INSERT INTO json_table (json_column) VALUES (X'7B22666F6F223A2022626172227D');

deviendra maintenant

INSERT INTO json_table (json_column) VALUES (CONVERT(X'7B22666F6F223A2022626172227D' using utf8mb4));
85
Lorcan O'Neill

J'ai eu ce problème avec les exportations faites par Sequel Pro. J'ai décoché l'option Output BLOB fields as hex et le problème a disparu. Lors de l'inspection visuelle de l'exportation, la présence de fichiers JSON lisibles au lieu de fichiers binaires était lisible.

55
Henry

Cela a fonctionné pour moi (j'avais également le contrôle de l'exportation vers le fichier SQL). Il y a beaucoup de mises en garde; par exemple. Je savais que les champs ne seraient jamais plus grands que 1 000 et ne contiendraient aucun caractère non-ASCII .

Avant exportation

alter table <table> modify <json_column> varchar(1000);

Puis après import

alter table <table> modify <json_column> json;
4
Lnr

J'ai fait face au même problème aujourd'hui. Ci-dessous, les résultats pour mon cas,

J'ai demandé à l'un de mes amis de générer un cliché SQL que je pouvais importer. Il a utilisé sequel-pro pour générer le dump (base de données d'exportation). Quand j'ai fait l'importation, il a jeté une erreur 

Cannot create a JSON value from a string with CHARACTER SET 'binary'

Il y avait donc un problème avec le dump généré: tous les champs json ont été convertis en un format brut, c’est-à-dire au lieu que la valeur soit

"{'key1':'value1', 'key2':'value2'}"

c'était,

X'nfdsklsdsklnfjkbvkjsdbvkjhdfsbvkjdsbnvljkdsbvkjhdfbvkjdfbvjkdfb'

Ainsi, lors de l’importation du dump, c’est-à-dire l’exécution des instructions insert, mysql ne pouvait pas traiter les données car elles n’étaient pas de type json .

Voici un lien vers le bug rapporté
https://github.com/sequelpro/sequelpro/issues/2397

Vous devez décocher l’option Output BLOB fields as hex.

2
swayamraina

J'ai eu ce problème avec un dépotoir. J'ai pu résoudre ce problème en modifiant la ligne dans le fichier de vidage à partir de:

/*!40101 SET NAMES binary*/;

à

/*!40101 SET NAMES utf8mb4*/;
0
Andrew Burns

vim version Pour la réponse de Lorcan O'Neill

vi xxxx.sql
:%s/\(X'[^,\)]*'\)/CONVERT(\1 using utf8mb4)/g
0
Kyogo Mochida

Ce problème étrange se produisait lors de l'exécution d'une requête UPDATE simple:

update some_table set json_attr = '{"test":168}' where id = 123456;

Redémarrer MySQL a corrigé le problème. N'a pas été capable d'identifier la cause.

Edit: Nous utilisons Aurora. Il semble que cela ait été lié à notre configuration étrange dans laquelle la même instance gérait les connexions maître/esclave/lecteur.

0
Emre

Pour ceux qui utilisent Sequel Pro vers juin 2019, en plus de désélectionner l'option "Champs BLOB de sortie en tant qu'hex" (comme indiqué ci-dessus), vous devez également utiliser la génération nocturne, qui a pris en charge les types JSON il y a deux ans. Ce support n’a pas encore atteint la version officielle.

0
Peter

Pour ceux comme moi, issus de Symfony 4/Doctrine, qui ont été choisis ici: pour certaines raisons, la même entité peut être résolue dans un fichier texte long de type MySQL stockant du JSON; ou un type json MySQL stockant json. La définition manuelle du type longtext MySQL a résolu le problème dans mon cas particulier.

0
Moonchild

remplacez le classement par utf8_general_ci. a travaillé pour moi. 

0
Swarup Bam