二进制 Blob 被截断为 8000 字节 - SQL Server 2008 / varbinary(max)

Posted

技术标签:

【中文标题】二进制 Blob 被截断为 8000 字节 - SQL Server 2008 / varbinary(max)【英文标题】:Binary Blob truncated to 8000 bytes - SQL Server 2008 / varbinary(max) 【发布时间】:2011-06-02 19:41:15 【问题描述】:

我已经从 Fluent Nhibernate 1.0 和 Nhibernate 2.1 升级到 pre- 使用 NHibernate 3.0 GA 发布 1.x 并达到了我认为的回归,但我想听听是否确实如此。

我正在使用 SQL Server Express 2008 和 MSSQL 2008 方言,并且有一个 System.Drawing.Image 类型的图像属性,我已将其映射为 这个:

Map (food => food.Image)
 .Length (int.MaxValue)
 .Nullable ();

表中的Image 列的类型为varbinary(MAX)

为属性生成的hbm是:

<property name="Image" type="System.Drawing.Image, System.Drawing,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
   <column name="Image" length="2147483647" not-null="false" />
</property>`

但是,无论我做什么,二进制 blob 都会被截断为 8000 字节 使用当前 FNH 和 NH 版本进行序列化时。那个没用 与以前的版本一样。

关于为什么会发生这种情况以及如何修复/解决它的想法?

【问题讨论】:

【参考方案1】:

我也遇到过类似的问题,经过大量实验后,我注意到当使用 Nhibernate 将我的架构生成到文件时,生成的列类型总是长度为 8000。

按照上面的建议将 CustomSqlType 设置为 Varbinary(max) 没有任何区别,但是,在我的 FluentMapping 中解决这个问题似乎可以解决问题:

Map(x => x.LogoBytes).CustomType("BinaryBlob").Length(1048576).Nullable();  

当然长度是任意的,但我认为它应该设置为小于 int.Max 的值。我是 Nhibernate 的新手,所以我仍在解决问题,但我很想知道这是否对你有帮助。

【讨论】:

这为我更正了;但是,我只是将 int.MaxValue 用于 Length,以免施加任何下限。 从 nhibernate 3.2.0.4000 和 fluentnhibernate 1.3.0.717 开始,我仍然必须使用它来超过 8000 的限制。 该解决方案也对我有用。当我使用 NH 3.2.400 和代码映射时,我使用了以下内容: map.Property(x => x.Image, status => status.Column(c => c.SqlType("VARBINARY(MAX)" ); c.Length(int.MaxValue); )); 我发现只需将长度设置为int.MaxValue 就足以解决此问题。 issue reported in NHibernate JIRA 表示他们不会解决此问题,但您需要手动指定长度,因此这是解决问题的正确方法。【参考方案2】:

在 3.0.0GA 中,以下映射似乎可以解决问题:

        <property name="Data" type="Serializable" length="2147483647" />

【讨论】:

【参考方案3】:

这是一个回归。我在https://nhibernate.jira.com/browse/NH-2484提出了一个错误并提供了补丁

【讨论】:

我对 NHibernate 3.1.0.4000 有同样的问题。我做错了吗? 我不知道 - 由于 3.0 上的其他依赖,我使用了修补过的 3.0,现在无法更新到 3.1 进行测试。最简单的方法是从错误报告中获取我的测试用例,将 3.0 替换为 3.1,看看它是否仍然抛出。如果是这样,我们应该重新打开缺陷,并且暂时您可以使用自定义 UserType for Image 来强制数据的大小。 经过更多测试,我发现 NH 3.1.0 不再有问题了。我正在使用另一个版本的损坏数据(以 8000 字节保存),然后我很难找出错误原因。现在好了。谢谢!【参考方案4】:

Map(x => x.Image).Length(100000).Not.Nullable();

添加上面的“长度(MAXVALUE)”,它将起作用:)

【讨论】:

【参考方案5】:

你试过了吗?

Map(x => x.Image).CustomSqlType("VARBINARY(MAX)");

【讨论】:

是的,我已经尝试过了,没有任何区别。我已经与 Fluent NHibernate 人员核实过,这不是他们方面的倒退,所以我提出了一个 nhibernate 问题。

以上是关于二进制 Blob 被截断为 8000 字节 - SQL Server 2008 / varbinary(max)的主要内容,如果未能解决你的问题,请参考以下文章

本地 DB 抛出字节数组截断长度为 8000 的异常

大型机 pkunzip 生成 PEX013W 记录被截断为 lrecl=

Linux下字符串截断符是啥?

(SqlServe)关于字符串长度被截断的问题

MySQL中BLOB和TEXT类型学习--MySql语法

以字节数组和二进制 (BLOB) 存储图像之间的区别以及哪个更快