【问题标题】:String or binary data would be truncated - large strings字符串或二进制数据将被截断 - 大字符串
【发布时间】:2016-12-04 05:23:51
【问题描述】:

我们有一个非常大的 nvarchar(max) 字段,其中包含 html。在这个 html 中是一个 img 标签。

例子:

<img style="float:right" src="data:image/png;base64,/9j/4AAQSkZJRgABAQEBLAEsAAD/7gAOQW....

这一列的长度是1645151,虽然被替换的比这个少了一点,但不是很多。

我们正在尝试做的是在 SQL 中对列进行替换:

declare @url varchar(50) = 'myimageurl';
UPDATE table SET field =
CAST(REPLACE(CAST(field as NVARCHAR(MAX)),@source,'@url') AS NVARCHAR(MAX))

@source 是上述图像字节作为字符串,在运行替换之前分配给 nvarchar(max) 变量。 dest 是图像的 url,而不是图像字节作为字符串。

虽然我仍然得到消息字符串或二进制数据会被截断。

有谁知道这是否可以在 SQL 中替换这么大的字符串。

【问题讨论】:

  • 只是考虑这个问题,我倾向于用图像 url 替换整个字段的值来代替二进制数据,而不是尝试进行字符串替换。我认为这会更干净,更容易阅读。而且更可靠。
  • 如果“field”的长度是1645151,外部的“CAST”不需要转换成nvarchar(1645151)吗? REPLACE 函数应该已经返回 nvarchar(max)。
  • @ADyson nvarchar 的最大大小为 8000
  • @SeanLange 就是这样。在那一刻我失去了理智。这意味着“字段”已经是 nvarchar(max),在这种情况下,为什么需要任何强制转换?
  • @ADyson,实际上,nvarchar(n) 的最大值是 4000 个字符而不是 8000 个字符。

标签: sql sql-server tsql replace


【解决方案1】:

我有同样的错误,但在不同的功能上。

错误是我的模式比我的表达式长,这意味着你的搜索模式将被截断。

我希望这对某人有所帮助。

另外,请确保将模式和表达式放在函数的正确位置。

【讨论】:

  • 例如,如果您键入 CHARINDEX(haystack, needle) 而不是正确的方式。我试图在 13 个字符的字符串中搜索 50,000 个字符的字符串,因为我是从 Postgres strpos 复制的,它的参数顺序相反。
【解决方案2】:

除了替换之外,您可以通过解析 img 标记的其余部分来重建整个字段吗?

类似:

declare @Field nvarchar(max) = '<img style="float:right" src="data:image/png;base64,/9j/4AAQSkZJRgA....BAQEBLAEsAAD/7gAOQW" />'
declare @Source nvarchar(max) = 'data:image/png;base64,/9j/4AAQSkZJRgA....BAQEBLAEsAAD/7gAOQW'
declare @URL nvarchar(max) = 'www.img.img/img.png'
declare @Chars int = 20

select left(@Field,patindex('%' + left(@Source,@Chars) + '%', @Field) - 1) as HTMLStart
        ,@URL as ImgURL
        ,right(@Field,len(@Field) - patindex('%' + right(@Source,@Chars) + '%', @Field) - @Chars + 1) as HTMLEnd

如果您想一次在整个数据集上运行它,您只需查找 src="data:image/png;base64, 元素并使用与上述类似的方法从那里向后工作。取决于您如何识别要替换哪些二进制数据以及替换它的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 2022-01-11
    • 1970-01-01
    相关资源
    最近更新 更多