调用Snowflake /api/v2/statements执行INSERT时双反斜杠丢失问题
Snowflake API 提交SQL出现多层反斜杠转义的原因
这个现象是请求链路中两层独立的转义规则依次生效叠加导致的,和接口本身逻辑无关:
- 第一层转义:JSON请求体的语法转义
你调用的/api/v2/statements接口接收JSON格式的POST请求体,JSON语法规定反斜杠\是专属转义字符:如果要在JSON字符串中表示一个真实的反斜杠字符,必须写成\\,否则JSON解析器会把单个反斜杠识别为转义标记,和后续字符合并处理。 - 第二层转义:Snowflake SQL的字符串字面量转义
Snowflake遵循标准SQL的字符串解析规则,单引号包裹的字符串字面量中,反斜杠同样是转义字符:如果要在字符串值中存入一个真实的反斜杠,必须在SQL语句里写\\,SQL解析器才会识别为单个反斜杠存入字段,单个\会被当做转义符直接消耗,不会存入结果。
你最初提交SQL时写的是(?<=\\?)|&,整个解析流程是:
- 客户端序列化JSON请求体时,先把字符串里的
\\解析为单个\,最终传给Snowflake服务端的SQL语句实际变成了INSERT INTO test (EXPRESSION) VALUES ('(?<=\?)|&') - Snowflake的SQL解析器处理该语句时,看到字符串里的单个
\,将其识别为转义符,转义后面的?(普通字符被反斜杠转义后还是字符本身),最终存入字段的内容就变成了丢失反斜杠的(?<=?)|&
当你把提交内容里的反斜杠改成4个即\\\\后,解析流程变为:
- JSON序列化阶段,
\\\\每两个一组解析为单个\,传给SQL解析器的语句为INSERT INTO test (EXPRESSION) VALUES ('(?<=\\?)|&') - SQL解析阶段,字符串里的
\\被解析为单个真实反斜杠,最终存入字段的内容就是你预期的(?<=\?)|&
快速验证方法:如果直接在Snowflake控制台执行写了2个反斜杠的INSERT语句,不需要额外加反斜杠就能得到正确存储结果,因为控制台提交时不会经过JSON序列化的转义环节。
内容的提问来源于stack exchange,提问作者Denny89
相关产品推荐
相关产品推荐

