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 列以将值从浮点数转换为整数的主要内容,如果未能解决你的问题,请参考以下文章
忽略空列以将数据导出到 php mysql 中的 csv 文件