SQL Server数据库中如何将Unicode转义值转换为UTF-8正确字符?
MSSQL Server 2017 转换\u格式Unicode转义序列为可读字符方案
推荐方案:原生JSON解析(性能最优,无自定义代码)
SQL Server 2017 原生支持JSON语法解析,JSON标准默认兼容\uXXXX格式的Unicode转义规则,不需要编写循环、拆分逻辑,直接调用内置JSON_VALUE函数即可自动完成转义。
单值验证代码
你给出的示例值可以直接用以下语句测试转换效果:
SELECT JSON_VALUE('"' + N'\u039b \u041e \u0422 \u0422 \u0410' + '"', '$') AS ConvertedResult
转换后输出:Λ О Т Т А
表字段批量转换
查询表中name列的转义结果时,需要先替换字符串内的双引号,避免JSON结构解析报错:
SELECT name AS OriginalEscapeValue, JSON_VALUE('"' + REPLACE(name, '"', '\"') + '"', '$') AS ReadableValue FROM 你的目标表名
备选方案:自定义标量函数解析(适配特殊场景)
如果待转换字符串包含JSON不兼容的控制字符,导致JSON_VALUE返回NULL,可以编写自定义函数逐段匹配转义序列,将\u后的4位十六进制码位转为整数后,通过NCHAR()函数拼接为正常字符。
函数定义代码
CREATE OR ALTER FUNCTION dbo.DecodeUnicodeEscape(@input NVARCHAR(MAX)) RETURNS NVARCHAR(MAX) AS BEGIN DECLARE @result NVARCHAR(MAX) = N'' DECLARE @cursor INT = 1 DECLARE @totalLen INT = LEN(@input) WHILE @cursor <= @totalLen BEGIN -- 识别\u开头的转义片段 IF SUBSTRING(@input, @cursor, 2) = N'\u' AND @cursor + 5 <= @totalLen BEGIN DECLARE @hexSegment CHAR(4) = SUBSTRING(@input, @cursor + 2, 4) -- 校验片段为合法十六进制值后执行转换 IF @hexSegment NOT LIKE '%[^0-9a-fA-F]%' BEGIN SET @result += NCHAR(CONVERT(INT, CONVERT(VARBINARY(4), '0x' + @hexSegment, 1))) SET @cursor += 6 CONTINUE END END -- 非转义字符直接拼接 SET @result += SUBSTRING(@input, @cursor, 1) SET @cursor += 1 END RETURN @result END
函数调用方式
SELECT name AS OriginalEscapeValue, dbo.DecodeUnicodeEscape(name) AS ReadableValue FROM 你的目标表名
注意事项
- 所有Unicode字符串常量前必须添加
N前缀,避免隐式转换为非Unicode编码造成字符丢失 - SQL Server的
nvarchar类型原生存储UTF-16编码的Unicode字符,转换完成后即为正确的可读字符;如果需要输出UTF-8编码的结果,在客户端读取、导出文件时指定编码为UTF-8即可,无需在数据库层面做额外编码转换 - 如果转换后显示为方框或乱码,检查查询客户端使用的字体是否支持对应字符集(如希腊字母、西里尔字母需要字体包含对应字形)
内容的提问来源于stack exchange,提问作者rotem
相关产品推荐
相关产品推荐

