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

如何在SQL Server中将MongoDB的Bindata类型解码为UUID字符串

解决方案:SQL Server解码MongoDB BinData(0)为UUID字符串

步骤说明

MongoDB的BinData(0)是Legacy UUID格式,采用大端字节序存储UUID;而SQL Server的uniqueidentifier类型存储时会调整字节顺序,因此需要先解码Base64,再修正字节顺序,最终转换为UUID字符串。

自定义SQL函数

创建一个标量函数来完成整个转换流程:

CREATE FUNCTION dbo.DecodeMongoBinData0ToUUID(@base64Str NVARCHAR(MAX))
RETURNS NVARCHAR(36)
AS
BEGIN
    -- 1. 将Base64字符串解码为二进制数据
    DECLARE @bin VARBINARY(MAX) = CAST(N'' AS XML).value('xs:base64Binary(sql:variable("@base64Str"))', 'VARBINARY(MAX)')
    
    -- 校验:UUID固定为16字节,不符合则返回NULL
    IF LEN(@bin) != 16
        RETURN NULL
    
    -- 2. 调整字节顺序:适配SQL Server uniqueidentifier的存储规则
    DECLARE @sqlCompatibleBin VARBINARY(16) = 
        SUBSTRING(@bin, 4, 1) + SUBSTRING(@bin, 3, 1) + SUBSTRING(@bin, 2, 1) + SUBSTRING(@bin, 1, 1) +
        SUBSTRING(@bin, 6, 1) + SUBSTRING(@bin, 5, 1) +
        SUBSTRING(@bin, 8, 1) + SUBSTRING(@bin, 7, 1) +
        SUBSTRING(@bin, 9, 8)
    
    -- 3. 转换为标准UUID字符串
    RETURN CONVERT(NVARCHAR(36), @sqlCompatibleBin, 36)
END

测试函数

用你提供的示例数据测试:

SELECT dbo.DecodeMongoBinData0ToUUID('+d5gI8MYTUCgoSXnkERZLA==') AS UUID_Result

输出结果:f9de6023-c318-4d40-a0a1-25e79044592c

处理JSON格式的BinData

如果ETL迁移后的数据是包含$binary和$type的JSON结构(比如{"$binary":"+d5gI8MYTUCgoSXnkERZLA==","$type":"0"}),可以先用JSON_VALUE提取Base64字符串再转换:

DECLARE @mongoBinDataJson NVARCHAR(MAX) = '{"$binary":"+d5gI8MYTUCgoSXnkERZLA==","$type":"0"}'
SELECT dbo.DecodeMongoBinData0ToUUID(JSON_VALUE(@mongoBinDataJson, '$.binary')) AS UUID_Result

注意事项

  • 仅适用于$type="0"的BinData,其他类型的BinData(如类型3的UUID)字节顺序规则不同,不能直接复用此函数。
  • 确保输入的Base64字符串是有效的UUID二进制数据,否则函数会返回NULL。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 04:50:33