首页 > 解决方案 > 什么是编码(, 'escape') SQL Server 中的 PostgreSQL 等价物?

问题描述

这个问题SQL Server相同,以下Postgres陈述的等价物是什么?

select encode(some_field, 'escape') from only some_table

标签: sql-serverstringtsql

解决方案


如果您需要此功能,则由您来实现它。假设您只需要该escape变体,您可以尝试将其实现为 T-SQL UDF。但是将字符串分开,逐个字符地工作并构建一个新字符串并不是 T-SQL 的优势。您将查看一个WHILE循环来计算输入字节长度的长度,SUBSTRING提取各个字节,并CHAR直接转换不需要八进制编码的字节。1

如果您打算开始这条路线(特别是如果您想支持其他格式),我会考虑使用SQL Server 中的 CLR 支持,以 .NET 语言创建函数(通常首选 C# ) 并在那里使用更丰富的字符串操作功能。

以上都假设您真正想要的是escape复制encode. 如果您只想“获取此二进制数据并给我一个安全的字符串来表示它”,只需使用CONVERT来获取二进制十六进制编码。


1这是我的尝试。我建议您在愤怒使用它之前进行大量测试和调整:

create function Postgresql_encode_escape (@input varbinary(max))
returns varchar(max)
as
begin
    declare @i int
    declare @len int
    declare @out varchar(max)
    declare @chr int

    select @i = 1, @out = '',@len = DATALENGTH(@input)
    while @i <= @len
    begin
        set @chr = SUBSTRING(@input,@i,1)
        if @chr > 31 and @chr < 128
        begin
            set @out = @out + CHAR(@chr)
        end
        else
        begin
            set @out = @out + '\' +
             RIGHT('000' + CONVERT(varchar(3),
                (@chr / 64)*100 +
                ((@chr / 8)%8)*10 +
                (@chr % 8))
             ,3)
        end
        set @i = @i + 1
    end

    return @out
end

推荐阅读