修改表列中存储的JSON字符串的属性值

alw*_*ner 14 php mysql json sql-update

我的JSON字符串存储在我的数据库列中.我必须在JSON字符串中更新该值.

这是我的桌子. 我的表像

我想更新state它里面的值.

例:

Name1有状态值KA所以我想将其更新为GJ.

到目前为止我尝试了什么?

UPDATE Customer
SET Detail = JSON_MODIFY(Detail , '$.Address.State', 'KA')
WHERE Name = 'name1';
Run Code Online (Sandbox Code Playgroud)

也试过JSON_REPLACE也行不通.

但它显示错误:

功能Customer.JSON_MODIFY 存在

注意:我知道一种解决方法,但我不想获取该字符串并完全更新它.我想更新字符串中的特定细节.

我也创建了SQL Fiddle.

我在localhost上这样做.以下是localhost详细信息.

Database server     
Server: localhost (localhost via TCP/IP)
Software: MySQL
MySQL Version :5.5.24

phpMyAdmin
Version information: 3.5.1, latest stable version: 4.7.3
Run Code Online (Sandbox Code Playgroud)

Mar*_*rio 6

正如@wchiquito已经指出的那样,在MySQL 5.7.8中添加了JSON功能.

如果您无法升级MySQL安装,则必须采取您提到的解决方法.如果不能定义自定义mysql函数,使用正则表达式替换值也是行不通的.(如果你用正则表达式做这样的操作,还有很多可能会出错...)

所以我看到的唯一选择是:

  1. 升级你的装置(奖励给@wchiquito).

  2. 获取列,解析并更新它.正如你提到自己是一种解决方法.

这可能看起来像这样:

// fetch the details
$sth = $pdo->prepare('select `Detail` from `Customer` where `Name` = ?');
$sth->execute(['name1']);

$detail = json_decode($sth->fetchColumn(), true);

// modify the state
$detail['Address']['State'] = 'KA';

// update the details
$sth = $pdo->prepare('update `Customer` set `Detail` = ? where `Name` = ?');
$sth->execute([json_encode($detail), 'name1']);
Run Code Online (Sandbox Code Playgroud)

但我建议尽可能升级MySQL安装.


wch*_*ito 5

12.16 JSON函数

...

除非另有说明,否则在MySQL 5.7.8中添加了JSON函数.

...

尝试:

UPDATE `Customer`
SET `Detail` = JSON_REPLACE(`Detail`, '$.Address.State', 'GJ')
WHERE `Name` = 'name1';
Run Code Online (Sandbox Code Playgroud)

db-fiddle.