Что произойдет, если я не укажу StringLength или MaxLength для свойства строки? - PullRequest
0 голосов
/ 25 мая 2018

Сейчас я создаю модели для базы данных с подходом, основанным на коде.Это будет для действительно больших данных (например, миллионов строк).Поэтому я стараюсь быть очень осторожным с типами, которые я выбрал.Использование шорт, байтов и перечислений везде, где это возможно.

Теперь аннотации StringLength и MaxLength ограничивают максимально допустимую длину строки (или массив для последней).

Итак, они обозначают количество байтов, резервируемое базой данных для этого поля?Если да, то сколько байтов зарезервировано, если они не были указаны?Или они только для целей проверки и ничего более?

Я даже не уверен, относится ли зарезервированное пространство в базе данных к выбранному мной типу.Возможно, внутренняя логика совершенно другая.

Когда я думаю об этом, в моей голове появляется другой вопрос.Что произойдет, если я добавлю столбец «Статья» с StringLength (1000)?Учитывая, что один char занимает 2 байта, резервирует ли он теперь 2 КБ для каждого поля?Или это совершенно не связано с этим?

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Это поведение зависит от различных параметров.Сначала в ваших базах данных, таких как 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);
}

Таблица:

enter image description here

Итак, он создал поля VARCHAR(1000) и LONGTEXT.Опять же, длина данных, которые она содержит, полностью зависит от сопоставления / кодирования поля.

LONGTEXT размер: 4 294 967 295 = (2 ^ 32−1) байт = 4 ГиБ

LONGTEXTможет содержать 4 294 967 295 байт данных.UTF-8 содержит многобайтовые символы.Поэтому, если вы заполните поле, используя только датский символ «Ø», вы получите только 2 147 483 647 символов, поскольку этот символ UTF-8 состоит из двух байтов.Если вы заполните его знаком «а», вы получите 4 294 967 295 символов.

0 голосов
/ 25 мая 2018

если вы не укажете StringLength или MaxLength в строковом свойстве, .net не будет ничего проверять, но база данных выдаст исключение, если ограничение нарушено.Пример: - размер столбца col1 равен 100 в дБ, и вы передаете значение размера 200, он вызывает исключение в дБ.

Когда вы объявляете столбец с размером 1000 в дБ,когда он будет выбран программно, размер будет равен 2 КБ для одного поля, если только вы не примените обрезку во время запроса.

Атрибуты используются в основном для декларации, информации и проверки. Атрибут - это декларативный тег, который используется для передачи во время выполнения информации о поведении различных элементов, таких как классы, методы, структуры, перечислители, сборки и т. Д. В вашей программе.Вы можете добавить декларативную информацию в программу, используя атрибут.Декларативный тег обозначается квадратными ([]) скобками, помещенными над элементом, для которого он используется.

Атрибуты используются для добавления метаданных, таких как инструкции компилятора и другая информация, такая как комментарии, описание, методы и классы.в программу..Net Framework предоставляет два типа атрибутов: предопределенные атрибуты и пользовательские атрибуты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...