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

Posted

技术标签:

【中文标题】MySQL:无法更新 JSON 列以将值从浮点数转换为整数【英文标题】:MySQL: Cannot update JSON column to convert value from float to integer 【发布时间】:2021-03-07 08:23:06 【问题描述】:

我有一个带有 JSON 列的 mysql 表。我想更新 JSON 列中的一些行以将 json 值从浮点数更改为整数。例如 "a": 20.0 应该变成 "a": 20。看起来 MySQL 发现这两个值是等效的,所以它从不费心更新行。

这是我的test 表的状态:

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 行)

mysql> update test
    set val=JSON_SET(
        val,
        "$.a",
        FLOOR(
            JSON_EXTRACT(val, "$.a")
        )
    )
where id=1;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0

(更改了 0 行)

mysql> insert into test (id, val) values (1, JSON_OBJECT("a", 20)) ON DUPLICATE KEY UPDATE id=VALUES(id), val=VALUES(val);
Query OK, 0 rows affected, 2 warnings (0.00 sec)

(0 行受影响)

看起来我尝试如何编写它并不重要,无论是尝试修改现有值,还是指定一个全新的 JSON_OBJECT。所以我想知道原因是否仅仅是因为 MySQL 认为前后值是等价的。

有没有办法解决这个问题?

【问题讨论】:

第一次更新没问题statement。 有趣,似乎可以在那里工作,但不能在我的本地 MySQL 服务器中工作。也许与引擎和/或配置有关?我在 Mac OSX 上运行 MySQL8.0.22 ``` $ mysql -V mysql Ver 8.0.22 for osx10.15 on x86_64 (Homebrew) ``` 您是否尝试过先将值设置为完全不同的值? 是的。这就是我最终采用的解决方法。我首先将值更改为"a": 20, "whatever": 1,然后将其更改回"a": 20... 看起来"a": 20 似乎等同于MySQL 的"a": 20.0,所以它根本不需要更新值。 @tomas - 请显示带有“已弃用”问题的整个语句。 【参考方案1】:

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

Gross... 8.0 在最近弃用某些内容后,有一段过快删除某些内容的顽皮历史。谨防。以下是 8.0.20 变更日志中 VALUES 的问题:

-- 2020-04-27 8.0.20 正式发布 -- -- -----

现在不推荐使用VALUES() 访问INSERT ... ON DUPLICATE KEY UPDATE 语句中的新行值,并且可能会在未来的 MySQL 版本中删除。相反,您应该使用 MySQL 8.0.19 及更高版本中实现的新行及其列的别名。

例如,此处显示的语句使用VALUES() 来访问新的行值:

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;

有关更多信息和示例,请参阅INSERT ... ON DUPLICATE KEY UPDATE Statement。

【讨论】:

唉,问题不仅在于 INSERT ... ON DUPLICATE KEY UPDATE 语句。我理解那里的警告,但我希望这会起作用:update test set val=JSON_OBJECT("a", 20) where id=1; 如果不起作用,唯一的选择是首先将值设置为完全不同的值,然后将其更改为我的预期值。 你可以试试截断 选择截断(值,小数位数) e. G.、select truncate(1.9999, 0) is 1

以上是关于MySQL:无法更新 JSON 列以将值从浮点数转换为整数的主要内容,如果未能解决你的问题,请参考以下文章

无法通过命令将值从视图传递到viewmodel

如何将值从mysql传递到create视图中的表单域

忽略空列以将数据导出到 php mysql 中的 csv 文件

将值从 json 数据存储到 arraylist 并填充视图持有者

在 Unity 中,如何将值从一个脚本传递到另一个脚本?

从浮点数转换为 QByteArray