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

MySQL中如何正确转义JSON_SET()函数里的星号?

解决MySQL JSON列含特殊字符(*)字段的更新问题

问题背景

用PHP构建自定义表单,将字段存储在MySQL的JSON列中,必填字段名带*(如Field3*)。更新这类字段时因转义规则混乱出现多种问题:

  • 无转义的写法:新建字段有效,但更新已有Field3*字段失效
  • 带三个反斜杠的写法:更新已有字段有效,但新建时会错误创建Field\*字段

核心错误修正

首先要修正SQL中的关键错误:你之前写的JSON_SET('Form', ...)是错的——第一个参数应该是JSON列名Form,而非字符串'Form',否则操作的是固定字符串,不是表中实际的JSON数据。

正确解决方案

1. MySQL JSON路径的规范写法

当键名包含*这类特殊字符时,MySQL要求用双引号包裹键名定义路径,无需纠结反斜杠转义。正确的路径表达式为:

$."Field3*"

2. 最终SQL语句

UPDATE Forms SET Form = JSON_SET(Form, '$."Field3*"', 'Value3') WHERE Some = 'attributes';

3. PHP中的安全实现(推荐用预处理)

为避免SQL注入和转义混乱,用PHP预处理语句绑定参数:

// 示例用PDO初始化数据库连接
$pdo = new PDO('mysql:host=localhost;dbname=your_database', 'username', 'password');

// 预处理SQL语句
$sql = 'UPDATE Forms SET Form = JSON_SET(Form, ? , ?) WHERE Some = ?';
$stmt = $pdo->prepare($sql);

// 绑定并执行参数
$stmt->execute(['$."Field3*"', 'Value3', 'attributes']);

效果验证

  • 新建字段:JSON列中无Field3*时,会正确添加该键值对
  • 更新已有字段:Field3*存在时,直接更新其值,不会生成错误键名

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 08:48:35