二进制 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)的主要内容,如果未能解决你的问题,请参考以下文章