如何利用SQL STRING_ESCAPE函数在SQL Server中转义JSON特殊字符?

小枫君_4291

小枫君_4291

2026-06-27

446人浏览

原创

string_escape仅负责json字符串内容转义,不加外层双引号、不处理null或非字符串类型,需配合isnull和手动添加引号才能安全拼接合法json。

如何利用sql string_escape函数在sql server中转义json特殊字符?

STRING_ESCAPE 不能直接用于 JSON 字符串拼接

很多人以为 STRING_ESCAPE 是给 JSON 字段“加引号+转义”的万能函数,实际不是。它只做单向转义,不加外层双引号,也不处理 NULL 或非字符串类型——直接套用会导致 JSON 格式错误或 SQL 报错。

典型错误场景:把用户输入的昵称 "O'Reilly & Co." 用 STRING_ESCAPE(value, 'json') 转成 O'Reilly & Co.,然后拼进 JSON 字符串:'{"name":"' + STRING_ESCAPE(@name, 'json') + '"}' → 得到 {"name":"O'Reilly & Co."},这不是合法 JSON(' 和 & 是 HTML 实体,不是 JSON 转义)。

  • STRING_ESCAPE 输出的是 JSON 兼容的字符串内容(如把 " → ",换行 → ),但不包双引号
  • 必须手动补上外层双引号,且确保输入是 varchar/nvarchar 类型;传入 NULL 会返回 NULL,需提前处理
  • SQL Server 2016+ 才支持,旧版本会报 Invalid function name 'STRING_ESCAPE'

正确拼 JSON 的三步法:转义 + 引号 + ISNULL

安全拼接 JSON 字段的核心是:先转义内容,再加双引号,最后兜底 NULL。漏掉任何一步都可能破坏 JSON 结构或引发解析失败。

比如构造用户信息 JSON:

chartjs-reporter
chartjs-reporter

此技能用于在用户需要将结构化数据(查询结果、CSV 摘要、JSON 记录或 Python 字典/列表)转换为独立的 HTML 页面时使用。

下载
SELECT 
  '{' +
    '"name":"' + ISNULL(STRING_ESCAPE(ISNULL(@name, ''), 'json'), '') + '"' +
    ',' +
    '"city":"' + ISNULL(STRING_ESCAPE(ISNULL(@city, ''), 'json'), '') + '"' +
  '}' AS json_fragment
  • ISNULL(@name, '') 防止 STRING_ESCAPE(NULL, 'json') 返回 NULL,导致整个表达式为 NULL
  • STRING_ESCAPE(..., 'json') 只处理字符串内部特殊字符("、、控制字符等),不碰引号本身
  • 外层双引号必须手写,且不能用 STRING_ESCAPE 套两层——那会把引号也转成 ",再加引号就变成 """,非法

比 STRING_ESCAPE 更稳的方式:用 FOR JSON AUTO 或 PATH

手工拼 JSON 容易出错,尤其字段多、嵌套深时。FOR JSON 是 SQL Server 原生方案,自动处理转义、类型映射、NULL 表示(默认省略,可用 INCLUDE_NULL_VALUES 控制),还支持数组和嵌套对象。

例如从表生成 JSON:

SELECT id, name, email 
FROM users 
WHERE id = 123
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
  • 输出自动是 {"id":123,"name":"O'Reilly","email":"a@b.c"} —— 单引号不用管," 和 全自动转义
  • PATH 模式允许自定义键名(如 name AS 'user.name'),AUTO 按 SELECT 列顺序推导结构
  • 性能上,FOR JSON 比字符串拼接快,尤其大数据量;但无法在复杂表达式里局部调用,得整条查询重构

常见报错和绕过方法

遇到 String or binary data would be truncated 或 JSON text is not properly formatted?大概率是没控制好长度或混用了转义方式。

  • STRING_ESCAPE 输出长度可能比原字符串长(如一个 " 变成 "),如果目标列是 varchar(50),而原始值 48 字符含 3 个引号,转义后就 51 字符 → 截断。建议输出列用 varchar(max) 或提前 LEN() 校验
  • 别把 STRING_ESCAPE 和 REPLACE 混用,比如先 REPLACE(@s, '"', '"') 再 STRING_ESCAPE → 重复转义,出现 \"
  • 中文字符、emoji 在 STRING_ESCAPE 下正常(UTF-16 编码下直接保留),但若客户端解析 JSON 时用错编码(如 GBK),会显示乱码——问题不在转义,在传输层

真正麻烦的不是怎么转义,而是确认 JSON 最终由谁消费:SQL Server 自己解析?前端 JS?还是中间 API?不同消费者对空白、NULL、编码容忍度不同,得按下游定规则。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

json js

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2155

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

3342

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1116

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

3839

7

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

5791

4

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

0

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

0

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

0

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

0

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
SQL 教程
SQL 教程

共61课时 | 7.4万人学习