MySQL中如何更新Blob字段内的指定JSON属性值?
解决MySQL中Blob字段内JSON内容的更新问题
嘿,咱们先说说你给出的那个UPDATE语句——它是不能实现需求的。你写的set protocolBlob='%"alg":"null"%'会直接把整个protocolBlob字段的值替换成%"alg":"null"%这个字符串,而不是替换原有内容里的指定子串,这显然不是你想要的结果。
下面给你两种靠谱的解决方案,根据你的MySQL版本来选:
方案一:适用于所有MySQL版本(字符串替换法)
因为你的Blob字段里存的是JSON格式的字符串,我们可以利用字符串替换来实现修改。通过CAST把Blob转成字符类型,用REPLACE替换目标内容后再存回去:
UPDATE ApplicationEntity SET protocolBlob = REPLACE(CAST(protocolBlob AS CHAR), '"alg":"None"', '"alg":"null"') WHERE protocolBlob LIKE '%"alg":"None"%';
说明:
CAST(protocolBlob AS CHAR):将Blob类型的字段转换为可操作的字符串REPLACE(...):精准替换"alg":"None"为"alg":"null"WHERE条件:确保只更新包含目标内容的记录,避免无意义的更新
方案二:适用于MySQL 8.0及以上(JSON函数法,更精准)
如果你的MySQL版本是8.0或更高,推荐用原生JSON函数来操作,这样能避免字符串替换可能带来的误匹配(比如其他字段恰巧包含相同的子串):
UPDATE ApplicationEntity SET protocolBlob = CAST( JSON_REPLACE( CAST(protocolBlob AS JSON), '$[0].alg', NULL ) AS BLOB ) WHERE JSON_EXTRACT(CAST(protocolBlob AS JSON), '$[0].alg') = 'None';
说明:
CAST(protocolBlob AS JSON):把Blob转成JSON类型,方便用JSON函数操作JSON_REPLACE('$[0].alg', NULL):定位到JSON数组的第一个元素($[0])的alg字段,将其值改为NULL(数据库会自动序列化为JSON格式的"null")CAST(... AS BLOB):把修改后的JSON转回Blob类型存回字段WHERE条件:用JSON_EXTRACT精准判断alg字段的值是否为None,确保只更新符合条件的记录
重要提醒
在执行UPDATE操作前,一定要先备份数据,或者在测试环境验证语句的正确性,避免误操作导致数据丢失。
内容的提问来源于stack exchange,提问作者John Doe




