Mysql 5.7.20:无法使用CHARACTER SET' binary'从字符串创建JSON值。

时间:2018-01-30 16:35:33

标签: mysql json mysql-5.7

使用带有JSON列的表导入SQL文件时,我遇到此问题。

数据库有

编码:utf8mb4_unicode_ci

整理:CREATE TABLE `tracking_data` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `route` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, `data` json NOT NULL, `user_id` int(10) unsigned NOT NULL, `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

这里是带有json列的表:

utf8mb4

我已经从堆栈溢出的question读取了答案,表明该表必须在show session variables like 'char%';上。我的已经,但我仍然面临着这个问题。

这仍然是错误:

  

第XXX行:无法从包含CHARACTER SET的字符串创建JSON值   '二进制'

当我运行 Variable_name Value character_set_client utf8mb4 character_set_connection utf8mb4 character_set_database utf8mb4 character_set_filesystem binary character_set_results utf8mb4 character_set_server latin1 character_set_system utf8 character_sets_dir /usr/share/mysql/charsets/ 时:

var StellarSdk = require('stellar-sdk');
StellarSdk.Network.usePublicNetwork();

var keypair = StellarSdk.Keypair.fromSecret('OUR SECRET');
var server = new StellarSdk.Server('https://horizon.stellar.org');

var sourceKeypair = StellarSdk.Keypair.random();
console.log(sourceKeypair.publicKey());
console.log(sourceKeypair.secret());

var secret = sourceKeypair.secret();
var public = sourceKeypair.publicKey();



server.loadAccount(keypair.publicKey())
  .then(function(source) {
    var transaction = new StellarSdk.TransactionBuilder(source)
      .addOperation(StellarSdk.Operation.payment({
        destination: public,
        amount: "1",
        asset: StellarSdk.Asset.native()
      }))
      .build();

    transaction.sign(keypair);

    return server.submitTransaction(transaction);
})
.then(function() {
  return server.loadAccount(public)
})
.catch(function(error) {
  console.error('Error!', error);
});

我该如何解决这个问题? 谢谢!

2 个答案:

答案 0 :(得分:3)

如果我的会话字符集为binary

,我可以重现您的错误
mysql [localhost] {msandbox} (test) > set names binary;
Query OK, 0 rows affected (0.00 sec)

mysql [localhost] {msandbox} (test) > insert into tracking_data (route, data, user_id) values ('route', '{"route": "value"}', 1);
ERROR 3144 (22032): Cannot create a JSON value from a string with CHARACTER SET 'binary'.

然后我可以通过将会话字符集设置为与表匹配来修复它:

mysql [localhost] {msandbox} (test) > set names utf8mb4;
Query OK, 0 rows affected (0.00 sec)

mysql [localhost] {msandbox} (test) > insert into tracking_data (route, data, user_id) values ('route', '{"route": "value"}', 1);
Query OK, 1 row affected (0.01 sec)

因此,我得出结论,您已将会话字符集设置为binary

运行show session variables like 'char%';并查看它告诉您的内容。

答案 1 :(得分: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类型的数据。

这是错误报告的链接
https://github.com/sequelpro/sequelpro/issues/2397