MySQL:无法更新JSON列以将值从浮点转换为整数

MySQL:无法更新JSON列以将值从浮点转换为整数,mysql,json,Mysql,Json,我有一个带有JSON列的MySQL表。我想更新JSON列中的一些行,将JSON值从浮点更改为整数。e、 g{a:20.0}应变成{a:20}。看起来MySQL发现这两个值是等价的,所以它从不费心更新行 以下是我的测试表的状态: mysql> describe test; +-------+------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------

我有一个带有JSON列的MySQL表。我想更新JSON列中的一些行,将JSON值从浮点更改为整数。e、 g
{a:20.0}
应变成
{a:20}
。看起来MySQL发现这两个值是等价的,所以它从不费心更新行

以下是我的
测试
表的状态:

mysql> describe test;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| id    | int  | NO   | PRI | NULL    |       |
| val   | json | YES  |     | NULL    |       |
+-------+------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> select * from test;
+----+-------------+
| id | val         |
+----+-------------+
|  1 | {"a": 20.0} |
+----+-------------+
1 row in set (0.00 sec)
我的目标是将
val
更改为
{a:20}

我尝试了以下查询:

mysql> update test set val=JSON_OBJECT("a", 20) where id=1;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0
(更改了0行)

(更改了0行)

(受影响的0行)

看起来无论我如何编写它,无论我是试图修改现有值,还是指定一个全新的JSON_对象,都无关紧要。所以我想知道原因是否仅仅是MySQL认为before和after值是等价的

有什么办法可以解决这个问题吗?

(这并没有解决最初的问题,而是解决了在回答问题时遇到的问题。)

恶心。。。8.0有一段淘气的历史,在最近不赞成某个东西之后,它会过快地删除它。当心。以下是8.0.20的更改日志中的
值问题:

-----2020-04-27 8.0.20通用性-------

现在不推荐使用来访问语句中的新行值,并可能在将来的MySQL版本中删除。相反,您应该为新行及其列使用别名,如MySQL 8.0.19及更高版本中实现的那样

例如,此处显示的语句用于访问新行值:

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6)
  ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
从今以后,您应该改为使用类似于以下的语句,该语句为新行使用别名:

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new
  ON DUPLICATE KEY UPDATE c = new.a+new.b;
或者,您可以为新行及其每列使用别名,如下所示:

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new(m,n,p)
  ON DUPLICATE KEY UPDATE c = m+n;

有关更多信息和示例,请参阅。

第一次更新没有问题。有趣的是,它似乎在那里工作,但在我的本地MySQL服务器中不起作用。可能与发动机和/或配置有关?我正在Mac OSX上运行MySQL8.0.22```x86_64(自制)上osx10.15的$mysql-V mysql版本8.0.22``您是否尝试过先将值设置为完全不同的值?是的。这就是我最终采用的解决方法。我首先将值更改为
{“a”:20,“whatever”:1}
,然后将其更改回
{“a”:20}
。。。对于MySQL来说,
{“a”:20}
似乎相当于
{“a”:20.0}
,因此根本不需要更新值。@tomas-请显示整个语句中的“弃用”问题。唉,问题不仅仅在于插入。。。关于重复密钥更新语句。我理解这里的警告,但我希望它能起作用:
updatetestsetval=JSON_对象(“a”,20),其中id=1
如果不起作用,剩下的唯一选项是首先将值设置为完全不同的值,然后将其更改为我的预期值。您可以尝试truncateSelect truncate(值,小数位数)e。例如,选择截断(1.9999,0)为1
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new
  ON DUPLICATE KEY UPDATE c = new.a+new.b;
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new(m,n,p)
  ON DUPLICATE KEY UPDATE c = m+n;