JSON.SET 的字符串为什么要写两层引号
JSON.SET product:1 $.name '"Striped Bowtie"'两层引号各管各的:
- 外层单引号给 shell / redis-cli:只是让空格不把参数拆开,发到服务器前就被剥掉了。
- 内层双引号给 JSON:服务器收到的是
"Striped Bowtie"这一串字节。
能不能省成一层?不能。Redis 的参数只有字节、没有类型,JSON.SET 规定这个参数是一段 JSON 文本。不加内层引号,服务器分不清 42、true、null 是数字、布尔、空值还是字符串:
JSON.SET p $.n '42' # 数字 42
JSON.SET p $.s '"42"' # 字符串 "42"如果规定「解析失败就当字符串」,写坏的 JSON(比如 {"a":1)会被悄悄存成一个字符串,更难排查。
MySQL 的 JSON_SET 只要一层引号,是因为 SQL 字面量本身就带类型。