为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
子衿沉夜 2021-06-28 12:47:13
现在我正在使用代码优先方法为数据库创建模型。它将用于非常大的数据(如数百万行)。所以,我试图对我选择的类型非常小心。尽可能使用 shorts、bytes 和 enums。现在, StringLength 和 MaxLength 注释都限制了字符串(或后者的数组)的最大允许长度。那么,他们是否指定了数据库为该字段保留的字节数?如果是这样,在未指定时保留了多少字节?或者它们仅用于验证目的而仅此而已?我什至不确定数据库中的保留空间是否与我选择的类型相关。也许内部逻辑完全不同。当我想到它时,另一个问题出现在我的脑海中。如果我添加一个带有 StringLength(1000) 的“文章”列,会发生什么?考虑到一个char占用 2 个字节,现在是否为每个字段保留 2kB?还是与此完全无关?
查看完整描述

2 回答

?
元芳怎么了

TA贡献1798条经验 获得超7个赞

此行为取决于各种参数。首先在你的数据库上,比如 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);

}

桌子:

//img1.sycdn.imooc.com//60e01f200001f6a907550233.jpg

所以它创建了一个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 个字符。


查看完整回答
反对 回复 2021-07-03
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

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

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

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

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


查看完整回答
反对 回复 2021-07-03
  • 2 回答
  • 0 关注
  • 306 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信