如果我没有在字符串属性上指定StringLength或MaxLength会发生什么?

时间:2018-05-25 08:18:28

标签: c# asp.net database entity-framework ef-code-first

现在我正在使用代码优先方法为数据库创建模型。这将是一个非常大的数据(如数百万行)。所以,我正在努力对我选择的类型非常谨慎。尽可能使用短路,字节和枚举。

现在,StringLength和MaxLength注释都限制了字符串的最大允许长度(或后者的数组)。

那么,他们是否指定数据库为该字段保留的字节数?如果是这样,当没有指定它们时保留多少字节?或者它们仅用于验证目的,仅此而已?

我甚至不确定数据库中的保留空间是否与我选择的类型相关。也许内部逻辑完全不同。

当我想到它时,另一个问题出现在我脑海中。如果我使用StringLength(1000)添加“Article”列,会发生什么?考虑到一个 char 占用2个字节,现在每个字段保留2kB吗?或者它与此完全无关?

2 个答案:

答案 0 :(得分:1)

此行为取决于各种参数。首先在您的数据库上,如SQL Server或MySQL,然后它依赖于整理也像utf8,latin1和所有。

我在MySQL DB上运行了两个案例,结果就是这样。

<强>型号:

public virtual string field1 { get; set; }

[StringLength(1000)]
public virtual string field2 { get; set; }

生成的迁移:

protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.AddColumn<string>(
        name: "field1",
        table: "Category",
        nullable: true);

    migrationBuilder.AddColumn<string>(
        name: "field2",
        table: "Category",
        maxLength: 1000,
        nullable: true);
}

表格

enter image description here

因此它创建了VARCHAR(1000)LONGTEXT字段。它所包含的数据长度再次完全取决于字段的整理/编码。

LONGTEXT大小:4,294,967,295 =(2 ^ 32-1)字节= 4 GiB

LONGTEXT可包含4,294,967,295字节的数据。 UTF-8包含多字节字符。因此,如果仅使用丹麦字符“Ø”填充字段,则只能获得2,147,483,647个字符,因为UTF-8字符由两个字节组成。如果你用“a”填充它,你将获得4,294,967,295个字符。

答案 1 :(得分:0)

如果你没有在字符串属性上指定StringLength或MaxLength,。net将不会验证任何内容,但是如果违反了约束,数据库将抛出异常。 例如: - db中col1的大小为100,如果传递大小为200的值,则会抛出db异常。

当你在db中声明一个大小为1000的列时,当它以编程方式获取时,单个字段的大小将为2 kb,除非你在查询时应用trim。

属性主要用于声明,信息和验证目的。 属性是一个声明性标记,用于向运行时传递有关程序中各种元素(如类,方法,结构,枚举器,程序集等)的行为的信息。您可以使用属性将声明性信息添加到程序中。声明性标记由位于其所用元素上方的方括号([])括号描述。

属性用于向程序添加元数据,例如编译器指令和其他信息,如注释,描述,方法和类。 .Net Framework提供两种类型的属性:预定义属性和自定义构建属性。