JSON列を含むデータベースをエクスポートしました。新しいサーバーに移行した後、インポートは毎回次のようなエラーでクラッシュしました:
cHARACTER SET 'binary'を使用して文字列からJSON値を作成できません
Stackoverflowで、私はこの投稿を見つけましたが、私にとってはうまくいきませんでした: mysqlimportはjson値のロードを妨げる「set @@ character_set_database = binary」を発行します
ファイルは2GBで、ファイルを開くことはできません。
誰でも私のデータベースファイルをインポートするアイデアを持っていますか?
エクスポートした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));
この問題は、Sequel Proによるエクスポートの処理で発生しました。 Output BLOB fields as hex
オプションをオフにすると、問題はなくなりました。エクスポートを視覚的に検査すると、バイナリではなく読みやすいJSONが示されました。
今日も同じ問題に直面しました。以下は私のケースの発見でした。
友人の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
オプション。
これでうまくいきました(sqlファイルへのエクスポートも制御できました)。警告がたくさんあります。例えばフィールドが1000を超えることは決してなく、非ASCII文字が含まれないことを知っていました。コメントをして、これがとても悪い理由をすべて教えてください:)
エクスポート前
alter table <table> modify <json_column> varchar(1000);
インポート後
alter table <table> modify <json_column> json;
ダンプでこの問題が発生しました。ダンプファイルの行を次のように変更することで修正できました。
/*!40101 SET NAMES binary*/;
に
/*!40101 SET NAMES utf8mb4*/;
vimバージョンLorcan O'Neillの回答用
vi xxxx.sql
:%s/\(X'[^,\)]*'\)/CONVERT(\1 using utf8mb4)/g
2019年6月頃にSequel Proを使用している場合、「上記のようにBLOBフィールドを16進オプションとして出力する」のチェックを外すことに加えて、2年前にJSONタイプのサポートを追加したナイトリービルドも使用する必要があります。このサポートはまだ公式リリースには至っていません。
単純なUPDATEクエリを実行すると、この奇妙な問題が発生していました。
update some_table set json_attr = '{"test":168}' where id = 123456;
MySQLを再起動すると修正されました。原因を特定できませんでした。
編集:Auroraを使用しています。同じインスタンスがマスター接続とスレーブ/リーダー接続の両方を処理するという奇妙な構成に関連しているようです。
Symfony 4/Doctrine:を使用してここに到着した私のようなものについては、何らかの理由で、JSONを格納するロングテキストMySQLタイプまたはjsonを格納するjson MySQLタイプで同じエンティティを解決できます。 MySQLタイプは、私の特定のケースで問題を解決しました。
すべてのMySQL JSONデータ型情報は、バイナリではなくUTF8MB4文字セットである必要があります。
照合をutf8_general_ciに変更します。私のために働いた。