web-dev-qa-db-ja.com

MySQL 5.7.12インポートは、CHARACTER SET 'binary'を使用して文字列からJSON値を作成できません

JSON列を含むデータベースをエクスポートしました。新しいサーバーに移行した後、インポートは毎回次のようなエラーでクラッシュしました:

cHARACTER SET 'binary'を使用して文字列からJSON値を作成できません

Stackoverflowで、私はこの投稿を見つけましたが、私にとってはうまくいきませんでした: mysqlimportはjson値のロードを妨げる「set @@ character_set_database = binary」を発行します

ファイルは2GBで、ファイルを開くことはできません。

誰でも私のデータベースファイルをインポートするアイデアを持っていますか?

41
Danny Bevers

エクスポートしたSQLテキストに正規表現を適用して、バイナリ文字列を挿入可能な形式に変換できます。この問題に直面したとき、これは私の迅速で汚い修正でした

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

この正規表現を適用するとは、

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

今なります

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

この問題は、Sequel Proによるエクスポートの処理で発生しました。 Output BLOB fields as hexオプションをオフにすると、問題はなくなりました。エクスポートを視覚的に検査すると、バイナリではなく読みやすいJSONが示されました。

77
Henry

今日も同じ問題に直面しました。以下は私のケースの発見でした。

友人の1人に、インポートするSQLダンプを生成するように依頼しました。彼はsequel-proダンプを生成します(データベースのエクスポート)。インポートを実行するとエラーがスローされました

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

そのため、生成されたダンプに問題があり、すべてのjsonフィールドは、値が

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

そうだった、

X'nfdsklsdsklnfjkbvkjsdbvkjhdfsbvkjdsbnvljkdsbvkjhdfbvkjdfbvjkdfb'

したがって、ダンプをインポートするとき、つまりinsertステートメントを実行するとき、mysql型ではないため、jsonはデータを処理できませんでした。

報告されているbugへのリンク
https://github.com/sequelpro/sequelpro/issues/2397

あなたはuncheckOutput BLOB fields as hexオプション。

17
swayamraina

これでうまくいきました(sqlファイルへのエクスポートも制御できました)。警告がたくさんあります。例えばフィールドが1000を超えることは決してなく、非ASCII文字が含まれないことを知っていました。コメントをして、これがとても悪い理由をすべて教えてください:)

エクスポート前

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

インポート後

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

ダンプでこの問題が発生しました。ダンプファイルの行を次のように変更することで修正できました。

/*!40101 SET NAMES binary*/;

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

vimバージョンLorcan O'Neillの回答用

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

2019年6月頃にSequel Proを使用している場合、「上記のようにBLOBフィールドを16進オプションとして出力する」のチェックを外すことに加えて、2年前にJSONタイプのサポートを追加したナイトリービルドも使用する必要があります。このサポートはまだ公式リリースには至っていません。

1
Peter

単純なUPDATEクエリを実行すると、この奇妙な問題が発生していました。

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

MySQLを再起動すると修正されました。原因を特定できませんでした。

編集:Auroraを使用しています。同じインスタンスがマスター接続とスレーブ/リーダー接続の両方を処理するという奇妙な構成に関連しているようです。

0
Emre

Symfony 4/Doctrine:を使用してここに到着した私のようなものについては、何らかの理由で、JSONを格納するロングテキストMySQLタイプまたはjsonを格納するjson MySQLタイプで同じエンティティを解決できます。 MySQLタイプは、私の特定のケースで問題を解決しました。

0
Moonchild

すべてのMySQL JSONデータ型情報は、バイナリではなくUTF8MB4文字セットである必要があります。

0
David Stokes

照合をutf8_general_ciに変更します。私のために働いた。

0
Swarup Bam