【发布时间】:2015-08-27 13:06:13
【问题描述】:
我已使用 EF fluent api 将文本字段的 MaxLength 指定为 4096,以限制其长度:
this.Property(p => p.MyText).HasMaxLength(4096).IsRequired();
但由于某种原因在 SQL Server 中,该列变为nvarchar (max)。
仅用于测试我是否指定 2048 以确保 SQL Server 得到更新
this.Property(p => p.MyText).HasMaxLength(2048).IsRequired();
这样就行了。
所以我的问题是为什么 EF 在 MaxLength(4096) 时设置 sql nvarchar (max)
【问题讨论】:
-
只要您的
nvarchar列少于 4000 个字符(每个 2 个字节)- SQL Server 将使用nvarchar(n)类型。上限为 4000 个字符 - 如果您指定的长度大于该长度,则别无选择,只能使用nvarchar(max)(最多支持 10 亿 个字符)跨度> -
@marc_s 这看起来很荒谬(我知道这不是你的错;我只是回应你的评论)。在 4000 和 2^31 - 1 之间有大量的空间。为什么我不能指定 8192 之类的?我想知道是否有技术原因,或者他们只是决定,“如果你需要超过 4000 个(这本身是任意的),那么 max 就必须这样做”。
-
@AriRoth:SQL Server 中的物理存储以 8K(8192 字节)的 页 组织。由于
nvarchar总是每个字符使用 2 个字节,并且每个页面都有几个标题字节,因此您基本上在单个页面上获得 8000 个字节(或 4000 个nvarchar字符) - 最多。因此,“正常”nvarchar(n)被限制为最大值。 4000 个字符(非 Unicodevarchar(n)限制为 8000 个字符)。如果您需要更多,那么您可以通过使用 8K 页面存储所有数据的非常精细(和复杂)的结构获得总共 2 GB 的存储空间 -
@marc_s 哦,是的,我忘记了 8k 页面大小。对我来说,nvarchar 基本上说“您可以将字段大小限制为 8k,但之后您将不得不使用 max”,这对我来说似乎很奇怪。我的意思是,这似乎是一个可以解决的问题,我想在很多情况下,您希望将字段大小限制为超过 4000 个字符且小于最大值。但我不是数据库管理员或其他任何人,所以它可能不像我认为的那样可解决。 :)
标签: c# sql-server entity-framework entity-framework-6