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

调用Snowflake /api/v2/statements执行INSERT时双反斜杠丢失问题

Snowflake API 提交SQL出现多层反斜杠转义的原因

这个现象是请求链路中两层独立的转义规则依次生效叠加导致的,和接口本身逻辑无关:

  • 第一层转义:JSON请求体的语法转义
    你调用的/api/v2/statements接口接收JSON格式的POST请求体,JSON语法规定反斜杠\是专属转义字符:如果要在JSON字符串中表示一个真实的反斜杠字符,必须写成\\,否则JSON解析器会把单个反斜杠识别为转义标记,和后续字符合并处理。
  • 第二层转义:Snowflake SQL的字符串字面量转义
    Snowflake遵循标准SQL的字符串解析规则,单引号包裹的字符串字面量中,反斜杠同样是转义字符:如果要在字符串值中存入一个真实的反斜杠,必须在SQL语句里写\\,SQL解析器才会识别为单个反斜杠存入字段,单个\会被当做转义符直接消耗,不会存入结果。

你最初提交SQL时写的是(?<=\\?)|&,整个解析流程是:

  1. 客户端序列化JSON请求体时,先把字符串里的\\解析为单个\,最终传给Snowflake服务端的SQL语句实际变成了INSERT INTO test (EXPRESSION) VALUES ('(?<=\?)|&')
  2. Snowflake的SQL解析器处理该语句时,看到字符串里的单个\,将其识别为转义符,转义后面的?(普通字符被反斜杠转义后还是字符本身),最终存入字段的内容就变成了丢失反斜杠的(?<=?)|&

当你把提交内容里的反斜杠改成4个即\\\\后,解析流程变为:

  1. JSON序列化阶段,\\\\每两个一组解析为单个\,传给SQL解析器的语句为INSERT INTO test (EXPRESSION) VALUES ('(?<=\\?)|&')
  2. SQL解析阶段,字符串里的\\被解析为单个真实反斜杠,最终存入字段的内容就是你预期的(?<=\?)|&

快速验证方法:如果直接在Snowflake控制台执行写了2个反斜杠的INSERT语句,不需要额外加反斜杠就能得到正确存储结果,因为控制台提交时不会经过JSON序列化的转义环节。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 01:33:18