繁体   English   中英

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

[英]What happens if I don't specify StringLength or MaxLength on a string property?

现在,我正在使用代码优先方法为数据库创建模型。 这将用于非常大的数据(如数百万行)。 因此,我在选择类型时要格外小心。 尽可能使用短裤,字节和枚举。

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

因此,它们是否指定数据库为该字段保留的字节数? 如果是这样,未指定字节时将保留多少字节? 还是仅出于验证目的而已?

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

当我考虑这件事时,我脑海中浮现出另一个问题。 如果我使用StringLength(1000)添加“文章”列,会发生什么情况? 考虑到一个char占用2个字节,是否现在为每个字段保留2kB? 还是与之完全无关?

此行为取决于各种参数。 首先在您的数据库(如SQL Server或MySQL)上,然后取决于排序规则(如utf8,latin1等)。

我已经在MySQL数据库上运行了这两种情况,这就是结果。

模型:

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);
}

表:

在此处输入图片说明

因此,它创建了一个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个字符。

如果未在字符串属性上指定StringLength或MaxLength,则.net不会验证任何内容,但如果违反约束,则数据库将引发异常。 例如:col1的大小在db中为100,并且您传递的大小为200,它将抛出db异常。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM