如果我没有在字符串 属性 上指定 StringLength 或 MaxLength 会怎样?
What happens if I don't specify StringLength or MaxLength on a string property?
现在我正在使用代码优先方法为数据库创建模型。它将用于非常大的数据(如数百万行)。所以,我试图非常小心我选择的类型。尽可能使用短裤、字节和枚举。
现在,StringLength 和 MaxLength 注释都限制了字符串(或后者的数组)的最大允许长度。
那么,他们是否指定了数据库为该字段保留的字节数?如果是这样,在没有指定的情况下保留了多少字节?或者它们仅仅是为了验证目的,仅此而已?
我什至不确定数据库中保留的 space 是否与我选择的类型相关。可能里面的逻辑完全不一样。
当我想到它时,另一个问题突然出现在我的脑海中。如果我添加一个带有 StringLength(1000) 的 "Article" 列,会发生什么?考虑到一个char占2个字节,现在是否为每个字段预留2kB?还是与此完全无关?
如果您没有在字符串上指定 StringLength 或 MaxLength 属性,.net 将不会验证任何内容,但如果违反约束,它的数据库将抛出异常。
例如:- col1 的大小在 db 中为 100,而您传递一个大小为 200 的值,它将抛出 db 异常。
当您在 db 中声明一个大小为 1000 的列时,当它以编程方式获取时,单个字段的大小将为 2 kb,除非您在查询时应用 trim。
属性主要用于声明、信息和验证目的。
属性是一种声明性标记,用于向运行时传达有关程序中各种元素(如 类、方法、结构、枚举器、程序集等)行为的信息。您可以使用属性向程序添加声明性信息。声明性标签由方括号 ([ ]) 表示,方括号位于它所用于的元素上方。
属性用于向程序添加元数据,例如编译器指令和其他信息,例如注释、描述、方法和 类。 .Net Framework 提供两种类型的属性:预定义属性和自定义属性。
此行为取决于各种参数。首先在你的数据库上,如 SQL 服务器或 MySQL,然后它取决于排序规则,如 utf8、latin1 和 all.
我的 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);
}
Table:
因此它创建了一个 VARCHAR(1000)
和 LONGTEXT
字段。同样,它包含的数据长度完全取决于字段的 collation/encoding。
LONGTEXT
大小:4,294,967,295 = (2^32−1) 字节 = 4 GiB
LONGTEXT
可以包含 4,294,967,295 字节的数据。 UTF-8 包含 multi-byte 个字符。因此,如果您仅使用丹麦字符“Ø”填充该字段,您将只会得到 2,147,483,647 个字符,因为该 UTF-8 字符由两个字节组成。如果你用 "a" 填充它,你将得到 4,294,967,295 个字符。
现在我正在使用代码优先方法为数据库创建模型。它将用于非常大的数据(如数百万行)。所以,我试图非常小心我选择的类型。尽可能使用短裤、字节和枚举。
现在,StringLength 和 MaxLength 注释都限制了字符串(或后者的数组)的最大允许长度。
那么,他们是否指定了数据库为该字段保留的字节数?如果是这样,在没有指定的情况下保留了多少字节?或者它们仅仅是为了验证目的,仅此而已?
我什至不确定数据库中保留的 space 是否与我选择的类型相关。可能里面的逻辑完全不一样。
当我想到它时,另一个问题突然出现在我的脑海中。如果我添加一个带有 StringLength(1000) 的 "Article" 列,会发生什么?考虑到一个char占2个字节,现在是否为每个字段预留2kB?还是与此完全无关?
如果您没有在字符串上指定 StringLength 或 MaxLength 属性,.net 将不会验证任何内容,但如果违反约束,它的数据库将抛出异常。 例如:- col1 的大小在 db 中为 100,而您传递一个大小为 200 的值,它将抛出 db 异常。
当您在 db 中声明一个大小为 1000 的列时,当它以编程方式获取时,单个字段的大小将为 2 kb,除非您在查询时应用 trim。
属性主要用于声明、信息和验证目的。 属性是一种声明性标记,用于向运行时传达有关程序中各种元素(如 类、方法、结构、枚举器、程序集等)行为的信息。您可以使用属性向程序添加声明性信息。声明性标签由方括号 ([ ]) 表示,方括号位于它所用于的元素上方。
属性用于向程序添加元数据,例如编译器指令和其他信息,例如注释、描述、方法和 类。 .Net Framework 提供两种类型的属性:预定义属性和自定义属性。
此行为取决于各种参数。首先在你的数据库上,如 SQL 服务器或 MySQL,然后它取决于排序规则,如 utf8、latin1 和 all.
我的 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);
}
Table:
因此它创建了一个 VARCHAR(1000)
和 LONGTEXT
字段。同样,它包含的数据长度完全取决于字段的 collation/encoding。
LONGTEXT
大小:4,294,967,295 = (2^32−1) 字节 = 4 GiB
LONGTEXT
可以包含 4,294,967,295 字节的数据。 UTF-8 包含 multi-byte 个字符。因此,如果您仅使用丹麦字符“Ø”填充该字段,您将只会得到 2,147,483,647 个字符,因为该 UTF-8 字符由两个字节组成。如果你用 "a" 填充它,你将得到 4,294,967,295 个字符。