MySQL:Зачем использовать VARCHAR(20) вместо VARCHAR(255)?[дубликат]

StackOverflow https://stackoverflow.com/questions/1262174

  •  12-09-2019
  •  | 
  •  

Вопрос

Возможный дубликат:
Есть ли недостатки в использовании общего типа varchar(255) для всех текстовых полей?

В MYSQL вы можете выбрать длину типа поля VARCHAR.Возможные значения: 1–255.

Но каковы его преимущества, если вы используете максимальное значение VARCHAR(255) вместо VARCHAR(20)?Насколько я знаю, размер записей зависит только от реальной длины вставленной строки.

размер (байты) = длина+1

Итак, если у вас есть слово «Пример» в поле VARCHAR (255), оно будет иметь 8 байтов.Если оно у вас есть в поле VARCHAR(20), оно тоже будет иметь 8 байт.В чем разница?

Я надеюсь, что вы можете мне помочь.Заранее спасибо!

Это было полезно?

Решение

Проверить: Ссылка на Варчар

Короче говоря, большой разницы нет, если только вы не превысите размер 255 в своем VARCHAR, что потребует еще один байт для префикса длины.

Длина указывает на большее ограничение на данные, хранящиеся в столбце, чем на что-либо еще.Это по своей сути также ограничивает МАКСИМАЛЬНЫЙ размер хранилища для столбца.ИМХО, длина должна иметь смысл по отношению к данным.Если вы храните номер социального страхования, нет смысла устанавливать длину 128, даже если это ничего не будет стоить вам в хранилище, если все, что вы на самом деле храните, это SSN.

Другие советы

Существует много веских причин для выбора значения меньше максимального, не связанных с производительностью.Установка размера помогает указать тип данных, которые вы храните, а также может выступать в качестве последней формы проверки.

Например, если вы храните почтовый индекс Великобритании, вам понадобится всего 8 символов.Установка этого ограничения помогает определить тип данных, которые вы храните.Если бы вы выбрали 255 символов, это только запутало бы ситуацию.

Я не знаю, как MySQL, но в SQL Server он позволит вам определять поля таким образом, чтобы общее количество используемых байтов превышало общее количество байтов, которые фактически могут быть сохранены в записи.Это плохо.Рано или поздно вы получите строку, в которой достигнут предел, и вы не сможете вставить данные.

Гораздо лучше спроектировать структуру базы данных с учетом ограничений размера строк.

Кроме того, да, вы не хотите, чтобы люди помещали 200 символов в поле, где максимальное значение должно быть 10.Если да, то это почти всегда неверные данные.

Вы скажете: ну, я могу ограничить это на уровне приложения.Но данные не попадают в базу данных только из одного приложения.Иногда его используют несколько приложений, иногда данные импортируются, а иногда исправляются вручную из окна запроса (например, обновите все записи, чтобы добавить 10 % к цене).Если какой-либо из этих других источников данных не знает о правилах, которые вы закладываете в свое приложение, в вашей базе данных будут плохие и бесполезные данные.Целостность данных должна обеспечиваться на уровне базы данных (что не мешает вам также проверять их перед вводом данных), иначе целостность отсутствует.Кроме того, по моему опыту, люди, которые слишком ленивы для проектирования своей базы данных, часто также слишком ленивы, чтобы на самом деле устанавливать ограничения в приложении, и проверка целостности данных вообще не осуществляется.

У них есть слово для обозначения баз данных без целостности данных — бесполезно.

Есть смысловая разница (и я считаю, что это единственная разница):если вы попытаетесь заполнить 30 символов, не отличных от пробела, в varchar(20), это приведет к ошибке, тогда как для varchar(255) это удастся.Так что это прежде всего дополнительное ограничение.

Что ж, если вы хотите разрешить запись большего размера или, возможно, ограничить размер записи.

Например, у вас может быть имя_имя как VARCHAR 20, но, возможно, street_address как VARCHAR 50, поскольку 20 может быть недостаточно места.В то же время вы можете контролировать, насколько большим может стать это значение.

Другими словами, вы установили потолок того, насколько большим может быть конкретное значение, теоретически, чтобы предотвратить слишком большой размер таблицы (и, возможно, записей индекса/индекса).

Вы можете просто использовать CHAR, который также имеет фиксированную ширину, но в отличие от VARCHAR, который может быть меньше, CHAR дополняет значения (хотя это обеспечивает более быстрый доступ к SQL).

С точки зрения производительности базы данных я не думаю, что будет разница.

Однако я думаю, что во многом решение о длине использования зависит от того, чего вы пытаетесь достичь, и документирования системы, чтобы она принимала только те данные, которые ей нужны.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top