首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Aurora读取副本:无法从具有字符集“二进制”的字符串创建JSON值

问Aurora读取副本:无法从具有字符集“二进制”的字符串创建JSON值
EN

Stack Overflow用户
提问于 2022-01-12 06:57:07
回答 1查看 338关注 0票数 0

我看过的相关票:1,2,3

我给出的解决方案的问题是,他们要求修改dumpfile,这在这种情况下是不可能的。

从线程正被此错误所阻塞:

代码语言:javascript
复制
  Error 'Cannot create a JSON value from a string with CHARACTER SET 'binary'.' on query. Default database: 'db'. Query: 'UPDATE ....

我的复制Aurora MySQL正在将binlog复制文件读取为二进制文件,无法从中生成json。我注意到的一件事是json对象中的这个部分。

代码语言:javascript
复制
_utf8mb4'<json object here>' COLLATE 'utf8mb4_bin'

主DB实例参数中有什么我可以更改的吗?还是极光复制品?

任何在这方面的帮助都是非常感谢的!

编辑:关于模式的更多信息

Aurora副本的Char和coll变量:

代码语言:javascript
复制
character_set_client    utf8mb4
character_set_connection    utf8mb4
character_set_database  latin1
character_set_filesystem    utf8mb4
character_set_results   utf8mb4
character_set_server    latin1
character_set_system    utf8
character_sets_dir  /rdsdbbin/oscar-5.7.mysql_aurora.2.10.1.0.4.0/share/charsets/
collation_connection    utf8mb4_general_ci
collation_database  latin1_swedish_ci
collation_server    latin1_swedish_ci

主DB的Char和coll变量:

代码语言:javascript
复制
character_set_client    utf8mb4
character_set_connection    utf8mb4
character_set_database  latin1
character_set_filesystem    binary
character_set_results   utf8mb4
character_set_server    latin1
character_set_system    utf8
character_sets_dir  /rdsdbbin/mysql-5.7.33.R2/share/charsets/
collation_connection    utf8mb4_general_ci
collation_database  latin1_swedish_ci
collation_server    latin1_swedish_ci

(注意,我在Aurora副本中手动将character_set_filesystem更改为utf8mb4,以尝试作为一种潜在的解决方案,但仍然会产生相同的错误)

带有错误的表在主DB和副本中具有完全相同的CREATE语句。

代码语言:javascript
复制
CREATE TABLE `item_list` (
  `_id` varchar(50) NOT NULL,
  `item_id` varchar(50) NOT NULL,
  `description_id` varchar(45) NOT NULL,
  `user_id` varchar(45) NOT NULL,
  `last_action` json DEFAULT NULL,
  `item_info` json DEFAULT NULL,
  PRIMARY KEY (`item_id`,`description_id`,`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

last_sql_error中的查询文本(文本被切断)

代码语言:javascript
复制
UPDATE item_list\n    SET last_action =  NAME_CONST('p_last_action',_utf8mb4'{\\"amount\\": 25380, \\"message\\": \\"Send to JL@CW\\", \\"actionId\\": \\"send\\", \\"photoPath\\": \\"https://s3-us-west-1.amazonaws.com/VBFrNVYIr.jpg\\"' COLLATE 'utf8mb4_bin') WHERE item_id =  NAME_CONST('p_item_
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-14 09:14:25

对于那些遇到同样问题的人,这是我们的调查结果。

我们看错了代码的一部分。在此之后,又有一个json查询导致了错误。

代码语言:javascript
复制
UPDATE db.item SET last_action = IFNULL(null, last_action) WHERE id = 1

在binlog dumpfile中,因为查询位于存储过程中,所以如下所示:

代码语言:javascript
复制
UPDATE db.item SET last_action = IFNULL(NAME_CONST('sp_param', null), last_action) WHERE id = 1

dumpfile添加了NAME_CONST()。如果您在MySQL中运行上述准确的查询,它将完美地工作。但是如果在Aurora MySQL中运行它,就会得到Cannot create a JSON value from a string with CHARACTER SET 'binary'。

为什么?MySQL和Aurora MySQL为同一个查询返回不同的类型

代码语言:javascript
复制
SELECT IFNULL(NAME_CONST('sp_param', value), last_action) FROM db.item WHERE id = 1;

MySQL --> returns a json
Aurora MySQL --> returns a blob which causes the error

删除NAME_CONST()修复了MySQL中的查询。但是,由于它包含在由MySQL binlog复制生成的dumpfile中,所以这不是解决方案。

解决方案是使用COALESCE而不是IFNULL,因为它在Aurora MySQL中具有相同的行为。

代码语言:javascript
复制
UPDATE db.item SET last_action = COALESCE(NAME_CONST(sp_param), last_action) WHERE id = 1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70677453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档