You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL中如何将JSON字段的字符串类型id转换为int整数类型

问题根因

你的更新语句没效果是两个写法规避不了的硬错:

  • 路径匹配错误:你存的JSON根节点是数组,不是普通对象,直接写$.id根本定位不到数组内部元素的id属性。单个数组元素的正确路径格式是$[数组索引].属性名,如果数组存了多个元素,写死单一路径没法覆盖所有项。
  • 取值逻辑完全错误:你写的REPLACE("$.id", '"', '')是对字面量字符串"$.id"做引号替换,根本没读取到字段里实际存的id值;就算你替换对了值,直接塞回去的还是字符串类型,不会自动转成整数。
正确写法

单元素数组场景(你的示例就是这种情况)

直接用JSON函数取值、转类型、写回即可,语句如下:

UPDATE products 
SET category_ids = JSON_SET(
  category_ids,
  "$[0].id",
  CAST(JSON_UNQUOTE(JSON_EXTRACT(category_ids, "$[0].id")) AS SIGNED INT)
)
WHERE id = any_row_id;

逻辑很简单:先用JSON_EXTRACT取到数组第一个元素的id值,JSON_UNQUOTE剥掉值外层的引号,再用CAST把字符串转成整数,最后写回原路径,执行完结果就是你要的[{"id":5,"position":1}]。

执行更新前务必先SELECT校验结果,避免误改:

SELECT category_ids 原始值, JSON_SET(category_ids, "$[0].id", CAST(JSON_UNQUOTE(JSON_EXTRACT(category_ids, "$[0].id")) AS SIGNED INT)) 转换后值 FROM products WHERE id = any_row_id;

确认转换后值符合预期再跑UPDATE。

多元素数组批量转换场景

如果你的JSON数组里有多个对象,需要把所有对象的id都从字符串转整数,MySQL 8.0+可以用JSON_TABLE拆分数组逐行转换,再重新组装成数组写回:

UPDATE products p
INNER JOIN (
  SELECT
    id,
    JSON_ARRAYAGG(
      JSON_OBJECT(
        'id', CAST(jt.id AS SIGNED INT),
        'position', jt.position
      )
    ) AS converted_category_ids
  FROM products,
  JSON_TABLE(
    category_ids,
    '$[*]' COLUMNS(
      id VARCHAR(32) PATH '$.id',
      position INT PATH '$.position'
    )
  ) jt
  -- 要全表更新就删掉下面这行条件
  WHERE id = any_row_id
  GROUP BY id
) tmp ON p.id = tmp.id
SET p.category_ids = tmp.converted_category_ids;

如果是MySQL 5.7版本没有JSON_TABLE函数,多元素场景不建议硬写JSON函数处理,把数据查出来在业务代码里转完再批量更新更稳妥,不容易出脏数据。

内容的提问来源于stack exchange,提问作者pyrogrammer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 23:18:26