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
相关产品推荐
相关产品推荐

