使用带有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);
});
我该如何解决这个问题? 谢谢!
答案 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